/*
* Copyright (C) 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 20. September 2007 by Joerg Schaible
*/
package com.thoughtworks.xstream.converters.extended;
import com.thoughtworks.acceptance.objects.Software;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import junit.framework.TestCase;
import java.beans.PropertyEditorSupport;
import java.util.HashMap;
import java.util.Map;
/**
* @author Jörg Schaible
*/
public class PropertyEditorCapableConverterTest extends TestCase {
public static class SoftwarePropertyEditor extends PropertyEditorSupport {
public String getAsText() {
Software software = (Software)getValue();
return software.vendor + ":" + software.name;
}
public void setAsText(String text) throws IllegalArgumentException {
int idx = text.indexOf(':');
setValue(new Software(text.substring(0, idx), text.substring(idx + 1)));
}
}
public void testCanBeUsedForCustomTypes() {
Software software = new Software("Joe Walnes", "XStream");
SingleValueConverter converter = new PropertyEditorCapableConverter(
SoftwarePropertyEditor.class, Software.class);
assertTrue(converter.canConvert(Software.class));
assertEquals("Joe Walnes:XStream", converter.toString(software));
assertEquals(software, converter.fromString("Joe Walnes:XStream"));
}
public void testConcurrentConversion() throws InterruptedException {
final SingleValueConverter converter = new PropertyEditorCapableConverter(
SoftwarePropertyEditor.class, Software.class);
final Map exceptions = new HashMap();
final ThreadGroup tg = new ThreadGroup(getName()) {
public void uncaughtException(Thread t, Throwable e) {
exceptions.put(e, t.getName());
super.uncaughtException(t, e);
}
};
final Map references = new HashMap();
final int[] counter = new int[1];
counter[0] = 0;
final Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; ++i) {
final String name = "JUnit Thread:" + i;
references.put(name, new Software("JUnit Thread", Integer.toString(i)));
threads[i] = new Thread(tg, name) {
public void run() {
int i = 0;
try {
synchronized (this) {
notifyAll();
wait();
}
final Software software = (Software)references.get(Thread
.currentThread()
.getName());
while (i < 1000 && !interrupted()) {
String formatted = converter.toString(software);
Thread.yield();
assertEquals(software, converter.fromString(formatted));
++i;
}
} catch (InterruptedException e) {
fail("Unexpected InterruptedException");
}
synchronized (counter) {
counter[0] += i;
}
}
};
}
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
threads[i].start();
threads[i].wait();
}
}
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
threads[i].notifyAll();
}
}
Thread.sleep(1000);
for (int i = 0; i < threads.length; ++i) {
threads[i].interrupt();
}
for (int i = 0; i < threads.length; ++i) {
synchronized (threads[i]) {
threads[i].join();
}
}
assertEquals("Exceptions have been thrown: " + exceptions, 0, exceptions.size());
assertTrue(
"Each thread should have made at least 1 conversion", counter[0] >= threads.length);
}
}