Refuse to write heterogeneous arrays.

This commit is contained in:
Jonathan Wood 2015-06-28 14:35:39 -07:00
parent 7ce548e616
commit 99c48231c2
9 changed files with 70 additions and 3 deletions

View file

@ -45,4 +45,9 @@ class BooleanConverter implements ValueConverter, ValueWriter {
}
private BooleanConverter() {}
@Override
public String toString() {
return "boolean";
}
}

View file

@ -119,4 +119,9 @@ class DateConverter implements ValueConverter, ValueWriter {
}
private DateConverter() {}
@Override
public String toString() {
return "datetime";
}
}

View file

@ -41,6 +41,7 @@ class MapValueWriter implements ValueWriter {
valueWriter.write(fromValue, context);
context.output.append('\n');
} else if (valueWriter == PRIMITIVE_ARRAY_VALUE_WRITER) {
context.setArrayKey(key.toString());
context.output.append(quoteKey(key)).append(" = ");
valueWriter.write(fromValue, context);
context.output.append('\n');

View file

@ -103,4 +103,8 @@ class NumberConverter implements ValueConverter, ValueWriter {
return false;
}
@Override
public String toString() {
return "number";
}
}

View file

@ -2,6 +2,8 @@ package com.moandjiezana.toml;
import java.util.Collection;
import static com.moandjiezana.toml.ValueWriters.WRITERS;
class PrimitiveArrayValueWriter extends ArrayValueWriter {
static final ValueWriter PRIMITIVE_ARRAY_VALUE_WRITER = new PrimitiveArrayValueWriter();
@ -20,12 +22,25 @@ class PrimitiveArrayValueWriter extends ArrayValueWriter {
}
boolean first = true;
ValueWriter firstWriter = null;
for (Object elem : values) {
if (!first) {
if (first) {
firstWriter = WRITERS.findWriterFor(elem);
first = false;
} else {
ValueWriter writer = WRITERS.findWriterFor(elem);
if (writer != firstWriter) {
throw new IllegalStateException(
context.getContextPath() +
": cannot write a heterogeneous array; first element was of type " + firstWriter +
" but found " + writer
);
}
context.output.append(", ");
}
ValueWriters.WRITERS.write(elem, context);
first = false;
WRITERS.write(elem, context);
}
if (!context.getTomlWriter().wantTerseArrays()) {
@ -35,4 +50,9 @@ class PrimitiveArrayValueWriter extends ArrayValueWriter {
}
private PrimitiveArrayValueWriter() {}
@Override
public String toString() {
return "primitive-array";
}
}

View file

@ -129,4 +129,9 @@ class StringConverter implements ValueConverter, ValueWriter {
}
private StringConverter() {}
@Override
public String toString() {
return "string";
}
}

View file

@ -24,4 +24,9 @@ class TableArrayValueWriter extends ArrayValueWriter {
}
private TableArrayValueWriter() {}
@Override
public String toString() {
return "table-array";
}
}

View file

@ -6,6 +6,7 @@ class WriterContext {
private String key = "";
private String currentTableIndent = "";
private String currentFieldIndent = "";
private String arrayKey = null;
private boolean isArrayOfTable = false;
private final TomlWriter tomlWriter;
StringBuilder output = new StringBuilder();
@ -83,4 +84,13 @@ class WriterContext {
public TomlWriter getTomlWriter() {
return tomlWriter;
}
public WriterContext setArrayKey(String arrayKey) {
this.arrayKey = arrayKey;
return this;
}
public String getContextPath() {
return key.isEmpty() ? arrayKey : key + "." + arrayKey;
}
}

View file

@ -210,6 +210,18 @@ public class ValueWriterTest {
assertEquals("", new TomlWriter().write(new TestClass()));
}
@Test(expected = IllegalStateException.class)
public void should_reject_heterogeneous_arrays() {
class BadArray {
Object[] array = new Object[2];
}
BadArray badArray = new BadArray();
badArray.array[0] = new Integer(1);
badArray.array[1] = "oops";
new TomlWriter().write(badArray);
}
@Test
public void should_elide_empty_intermediate_tables() {
class C {