// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.preferences;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import org.junit.Test;
import org.openstreetmap.josm.data.Version;
/**
* Unit tests for class {@link PreferencesWriter}.
*/
public class PreferencesWriterTest {
private static <T extends AbstractSetting<?>> T setting(T s, long time) {
s.setTime(time);
return s;
}
/**
* Unit test of {@link PreferencesWriter#visit(ListListSetting)}.
* @throws IOException if any I/O error occurs
*/
@Test
public void testListList() throws IOException {
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
long time = System.currentTimeMillis() / 1000;
w.visit(setting(new ListListSetting(Arrays.asList(Arrays.asList("bar"))), time));
assertEquals(String.format(
" <lists key='null' time='%d'>%n" +
" <list>%n" +
" <entry value='bar'/>%n" +
" </list>%n" +
" </lists>%n", time),
out.toString());
}
}
/**
* Unit test of {@link PreferencesWriter#visit(ListSetting)}.
* @throws IOException if any I/O error occurs
*/
@Test
public void testList() throws IOException {
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
long time = System.currentTimeMillis() / 1000;
w.visit(setting(new ListSetting(Arrays.asList("bar")), time));
assertEquals(String.format(
" <list key='null' time='%d'>%n" +
" <entry value='bar'/>%n" +
" </list>%n", time),
out.toString());
}
}
/**
* Unit test of {@link PreferencesWriter#visit(MapListSetting)}.
* @throws IOException if any I/O error occurs
*/
@Test
public void testMapList() throws IOException {
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
long time = System.currentTimeMillis() / 1000;
Map<String, String> map = new HashMap<>();
map.put("foo", "bar");
w.visit(setting(new MapListSetting(Arrays.asList(map)), time));
assertEquals(String.format(
" <maps key='null' time='%d'>%n" +
" <map>%n" +
" <tag key='foo' value='bar'/>%n" +
" </map>%n" +
" </maps>%n", time),
out.toString());
}
}
/**
* Unit test of {@link PreferencesWriter#visit(StringSetting)}.
* @throws IOException if any I/O error occurs
*/
@Test
public void testString() throws IOException {
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
long time = System.currentTimeMillis() / 1000;
w.visit(setting(new StringSetting("bar"), time));
assertEquals(String.format(
" <tag key='null' time='%d' value='bar'/>%n", time),
out.toString());
}
}
/**
* Unit test of {@link PreferencesWriter#write(java.util.Collection)}.
* @throws IOException if any I/O error occurs
*/
@Test
public void testWrite() throws IOException {
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
long time = System.currentTimeMillis() / 1000;
Map<String, Setting<?>> map = new HashMap<>();
map.put("foo", setting(new StringSetting("bar"), time));
w.write(map.entrySet());
assertEquals(String.format(
// CHECKSTYLE.OFF: LineLength
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n" +
"<preferences-defaults xmlns='http://josm.openstreetmap.de/preferences-1.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' version='%d'>%n" +
" <tag key='foo' time='%d' value='bar'/>%n" +
"</preferences-defaults>%n",
// CHECKSTYLE.ON: LineLength
Version.getInstance().getVersion(), time),
out.toString());
}
}
/**
* Test null value in default preferences.
* @throws IOException if any I/O error occurs
*/
@Test
public void testNullValue() throws IOException {
long time = System.currentTimeMillis() / 1000;
// CHECKSTYLE.OFF: LineLength
String expected = String.format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n" +
"<preferences-defaults xmlns='http://josm.openstreetmap.de/preferences-1.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' version='%d'>%n" +
" <list key='foo_list' time='%2$d' xsi:nil='true'/>%n" +
" <lists key='foo_listlist' time='%2$d' xsi:nil='true'/>%n" +
" <maps key='foo_maplist' time='%2$d' xsi:nil='true'/>%n" +
" <tag key='foo_tag' time='%2$d' xsi:nil='true'/>%n" +
"</preferences-defaults>%n",
Version.getInstance().getVersion(), time);
// CHECKSTYLE.ON: LineLength
try (StringWriter out = new StringWriter(); PreferencesWriter w = new PreferencesWriter(new PrintWriter(out), true, true)) {
SortedMap<String, Setting<?>> map = new TreeMap<>();
map.put("foo_tag", setting(new StringSetting(null), time));
map.put("foo_list", setting(new ListSetting(null), time));
map.put("foo_listlist", setting(new ListListSetting(null), time));
map.put("foo_maplist", setting(new MapListSetting(null), time));
w.write(map.entrySet());
assertEquals(expected, out.toString());
}
}
}