Refuse to write TOML fragments.

This commit is contained in:
Jonathan Wood 2015-07-04 17:50:52 -07:00
parent 8a8319b5f9
commit 568a77b1bf
2 changed files with 52 additions and 8 deletions

View file

@ -1,7 +1,5 @@
package com.moandjiezana.toml;
import static com.moandjiezana.toml.ValueWriters.WRITERS;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
@ -13,6 +11,10 @@ import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import static com.moandjiezana.toml.MapValueWriter.*;
import static com.moandjiezana.toml.ObjectValueWriter.*;
import static com.moandjiezana.toml.ValueWriters.WRITERS;
/**
* <p>Converts Objects to TOML</p>
*
@ -144,9 +146,16 @@ public class TomlWriter {
* @param from the object to be written
* @param target the Writer to which TOML will be written. The Writer is not closed.
* @throws IOException if target.write() fails
* @throws IllegalStateException if
*/
public void write(Object from, Writer target) throws IOException {
WriterContext context = new WriterContext(indentationPolicy, datePolicy, target);
WRITERS.findWriterFor(from).write(from, context);
ValueWriter writer = WRITERS.findWriterFor(from);
if (writer == MAP_VALUE_WRITER || writer == OBJECT_VALUE_WRITER) {
WRITERS.findWriterFor(from).write(from, context);
} else {
throw new IllegalStateException("Top-level value must not be a primitive or array.");
}
}
}

View file

@ -281,12 +281,17 @@ public class TomlWriterTest {
@Test
public void should_write_strings_to_toml_utf8() throws UnsupportedEncodingException {
String input = " é foo € \b \t \n \f \r \" \\ ";
assertEquals("\" \\u00E9 foo \\u20AC \\b \\t \\n \\f \\r \\\" \\\\ \"", new TomlWriter().write(input));
class Utf8Test {
String input;
}
Utf8Test utf8Test = new Utf8Test();
utf8Test.input = " é foo € \b \t \n \f \r \" \\ ";
assertEquals("input = \" \\u00E9 foo \\u20AC \\b \\t \\n \\f \\r \\\" \\\\ \"\n", new TomlWriter().write(utf8Test));
// Check unicode code points greater than 0XFFFF
input = " \uD801\uDC28 \uD840\uDC0B ";
assertEquals("\" \\U00010428 \\U0002000B \"", new TomlWriter().write(input));
utf8Test.input = " \uD801\uDC28 \uD840\uDC0B ";
assertEquals("input = \" \\U00010428 \\U0002000B \"\n", new TomlWriter().write(utf8Test));
}
@Test
@ -438,11 +443,41 @@ public class TomlWriterTest {
assertEquals(expected, writer.write(o));
}
private static class SimpleTestClass {
int a = 1;
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_string_fragment() {
new TomlWriter().write("fragment");
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_boolean_fragment() {
new TomlWriter().write(true);
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_number_fragment() {
new TomlWriter().write(42);
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_date_fragment() {
new TomlWriter().write(new Date());
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_array_fragment() {
new TomlWriter().write(new int[2]);
}
@Test(expected = IllegalStateException.class)
public void should_refuse_to_write_table_array_fragment() {
new TomlWriter().write(new SimpleTestClass[2]);
}
@Test
public void should_write_to_writer() throws IOException {
StringWriter output = new StringWriter();