From 48df906a43ba47a0449ad846e9c137f0b0058b1d Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Thu, 5 May 2022 20:51:35 -0500 Subject: [PATCH] Update (done by @taahanis, I'm just repushing) --- .gitignore | 3 + .travis.yml | 8 - CHANGELOG.md | 10 +- CONTRIBUTING.md | 4 +- LICENSE | 2 +- README.md | 16 +- build.gradle.kts | 16 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++ gradlew.bat | 89 +++ pom.xml | 161 ----- settings.gradle.kts | 2 + .../com/moandjiezana/toml/Identifier.java | 266 -------- .../toml/LiteralStringValueReader.java | 42 -- .../com/moandjiezana/toml/MapValueWriter.java | 98 --- .../moandjiezana/toml/ObjectValueWriter.java | 73 --- src/main/java/com/moandjiezana/toml/Toml.java | 429 ------------- .../com/moandjiezana/toml/TomlWriter.java | 161 ----- .../com/moandjiezana/toml/ValueReaders.java | 37 -- .../com/moandjiezana/toml/ValueWriters.java | 38 -- .../com/moandjiezana/toml/WriterContext.java | 145 ----- .../plex}/toml/ArrayValueReader.java | 23 +- .../plex}/toml/ArrayValueWriter.java | 9 +- .../plex}/toml/BooleanValueReaderWriter.java | 2 +- .../plex}/toml/Container.java | 24 +- .../plex}/toml/Context.java | 10 +- .../plex}/toml/DatePolicy.java | 4 +- .../plex}/toml/DateValueReaderWriter.java | 6 +- src/main/java/dev/plex/toml/Identifier.java | 331 ++++++++++ .../plex}/toml/IdentifierConverter.java | 4 +- .../plex}/toml/IndentationPolicy.java | 4 +- .../plex}/toml/InlineTableValueReader.java | 17 +- .../moandjiezana => dev/plex}/toml/Keys.java | 4 +- .../plex/toml/LiteralStringValueReader.java | 47 ++ .../java/dev/plex/toml/MapValueWriter.java | 167 +++++ .../MultilineLiteralStringValueReader.java | 5 +- .../toml/MultilineStringValueReader.java | 13 +- .../plex}/toml/NumberValueReaderWriter.java | 11 +- .../java/dev/plex/toml/ObjectValueWriter.java | 88 +++ .../plex}/toml/PrimitiveArrayValueWriter.java | 13 +- .../plex}/toml/Results.java | 23 +- .../plex}/toml/StringValueReaderWriter.java | 5 +- .../plex}/toml/TableArrayValueWriter.java | 9 +- src/main/java/dev/plex/toml/Toml.java | 481 +++++++++++++++ .../plex}/toml/TomlParser.java | 20 +- src/main/java/dev/plex/toml/TomlWriter.java | 178 ++++++ .../plex}/toml/ValueReader.java | 6 +- src/main/java/dev/plex/toml/ValueReaders.java | 35 ++ .../plex}/toml/ValueWriter.java | 2 +- src/main/java/dev/plex/toml/ValueWriters.java | 28 + .../java/dev/plex/toml/WriterContext.java | 182 ++++++ .../java/com/moandjiezana/toml/ArrayTest.java | 110 ---- .../com/moandjiezana/toml/BareKeysTest.java | 123 ---- .../com/moandjiezana/toml/BooleanTest.java | 27 - .../toml/BurntSushiInvalidTest.java | 218 ------- .../toml/BurntSushiValidEncoderTest.java | 214 ------- .../toml/BurntSushiValidTest.java | 361 ----------- .../com/moandjiezana/toml/ContainsTest.java | 79 --- .../java/com/moandjiezana/toml/DateTest.java | 73 --- .../moandjiezana/toml/DefaultValueTest.java | 125 ---- .../moandjiezana/toml/ErrorMessagesTest.java | 137 ----- .../moandjiezana/toml/InlineTableTest.java | 236 ------- .../com/moandjiezana/toml/IterationTest.java | 115 ---- .../com/moandjiezana/toml/NumberTest.java | 210 ------- .../com/moandjiezana/toml/QuotedKeysTest.java | 137 ----- .../com/moandjiezana/toml/RealWorldTest.java | 155 ----- .../com/moandjiezana/toml/StringTest.java | 131 ---- .../com/moandjiezana/toml/TableArrayTest.java | 127 ---- .../java/com/moandjiezana/toml/TableTest.java | 134 ---- .../moandjiezana/toml/TomlDefaultsTest.java | 76 --- .../com/moandjiezana/toml/TomlReadTest.java | 82 --- .../java/com/moandjiezana/toml/TomlTest.java | 100 --- .../moandjiezana/toml/TomlToClassTest.java | 141 ----- .../com/moandjiezana/toml/TomlWriterTest.java | 575 ------------------ .../com/moandjiezana/toml/Toml_ToMapTest.java | 26 - .../com/moandjiezana/toml/UnicodeTest.java | 22 - .../toml/testutils/ExtraPrimitives.java | 24 - .../toml/testutils/FruitArray.java | 20 - .../toml/testutils/TomlPrimitives.java | 13 - .../toml/testutils/TomlTableArrays.java | 10 - .../toml/testutils/TomlTables.java | 9 - .../moandjiezana/toml/testutils/Utils.java | 10 - src/test/resources/IteratorTest/list.toml | 1 - src/test/resources/IteratorTest/long.toml | 1 - src/test/resources/IteratorTest/multiple.toml | 7 - src/test/resources/IteratorTest/table.toml | 1 - .../resources/IteratorTest/table_array.toml | 3 - .../array-mixed-types-arrays-and-ints.toml | 1 - .../array-mixed-types-ints-and-floats.toml | 1 - .../array-mixed-types-strings-and-ints.toml | 1 - .../invalid/datetime-malformed-no-leads.toml | 1 - .../invalid/datetime-malformed-no-secs.toml | 1 - .../invalid/datetime-malformed-no-t.toml | 1 - .../invalid/datetime-malformed-no-z.toml | 1 - .../datetime-malformed-with-milli.toml | 1 - .../invalid/duplicate-key-table.toml | 5 - .../burntsushi/invalid/duplicate-keys.toml | 2 - .../burntsushi/invalid/duplicate-tables.toml | 2 - .../invalid/empty-implicit-table.toml | 1 - .../toml/burntsushi/invalid/empty-table.toml | 1 - .../invalid/float-no-leading-zero.toml | 2 - .../invalid/float-no-trailing-digits.toml | 2 - .../toml/burntsushi/invalid/key-empty.toml | 1 - .../toml/burntsushi/invalid/key-hash.toml | 1 - .../toml/burntsushi/invalid/key-newline.toml | 2 - .../burntsushi/invalid/key-open-bracket.toml | 1 - .../invalid/key-single-open-bracket.toml | 1 - .../burntsushi/invalid/key-start-bracket.toml | 3 - .../burntsushi/invalid/key-two-equals.toml | 1 - .../invalid/string-bad-byte-escape.toml | 1 - .../burntsushi/invalid/string-bad-escape.toml | 1 - .../invalid/string-byte-escapes.toml | 1 - .../burntsushi/invalid/string-no-close.toml | 1 - .../invalid/table-array-implicit.toml | 14 - .../table-array-malformed-bracket.toml | 2 - .../invalid/table-array-malformed-empty.toml | 2 - .../toml/burntsushi/invalid/table-empty.toml | 1 - .../invalid/table-nested-brackets-close.toml | 2 - .../invalid/table-nested-brackets-open.toml | 2 - .../invalid/text-after-array-entries.toml | 4 - .../invalid/text-after-integer.toml | 1 - .../burntsushi/invalid/text-after-string.toml | 1 - .../burntsushi/invalid/text-after-table.toml | 1 - .../invalid/text-before-array-separator.toml | 4 - .../burntsushi/invalid/text-in-array.toml | 5 - .../toml/burntsushi/valid/array-empty.json | 11 - .../toml/burntsushi/valid/array-empty.toml | 1 - .../toml/burntsushi/valid/array-nospaces.json | 10 - .../toml/burntsushi/valid/array-nospaces.toml | 1 - .../burntsushi/valid/arrays-hetergeneous.json | 19 - .../burntsushi/valid/arrays-hetergeneous.toml | 1 - .../toml/burntsushi/valid/arrays-nested.json | 13 - .../toml/burntsushi/valid/arrays-nested.toml | 1 - .../toml/burntsushi/valid/arrays.json | 34 -- .../toml/burntsushi/valid/arrays.toml | 8 - .../toml/burntsushi/valid/bool.json | 4 - .../toml/burntsushi/valid/bool.toml | 2 - .../burntsushi/valid/comments-everywhere.json | 12 - .../burntsushi/valid/comments-everywhere.toml | 24 - .../toml/burntsushi/valid/datetime.json | 3 - .../toml/burntsushi/valid/datetime.toml | 1 - .../toml/burntsushi/valid/empty.json | 1 - .../toml/burntsushi/valid/empty.toml | 0 .../toml/burntsushi/valid/example.json | 14 - .../toml/burntsushi/valid/example.toml | 5 - .../toml/burntsushi/valid/float.json | 4 - .../toml/burntsushi/valid/float.toml | 2 - .../valid/implicit-and-explicit-after.json | 10 - .../valid/implicit-and-explicit-after.toml | 5 - .../valid/implicit-and-explicit-before.json | 10 - .../valid/implicit-and-explicit-before.toml | 5 - .../burntsushi/valid/implicit-groups.json | 9 - .../burntsushi/valid/implicit-groups.toml | 2 - .../toml/burntsushi/valid/integer.json | 4 - .../toml/burntsushi/valid/integer.toml | 2 - .../burntsushi/valid/key-equals-nospace.json | 3 - .../burntsushi/valid/key-equals-nospace.toml | 1 - .../burntsushi/valid/key-space-modified.json | 3 - .../burntsushi/valid/key-space-modified.toml | 1 - .../toml/burntsushi/valid/key-space.json | 3 - .../toml/burntsushi/valid/key-space.toml | 1 - .../valid/key-special-chars-modified.json | 5 - .../valid/key-special-chars-modified.toml | 1 - .../burntsushi/valid/key-special-chars.json | 5 - .../burntsushi/valid/key-special-chars.toml | 1 - .../valid/keys-with-dots-modified.json | 14 - .../valid/keys-with-dots-modified.toml | 10 - .../toml/burntsushi/valid/keys-with-dots.json | 14 - .../toml/burntsushi/valid/keys-with-dots.toml | 10 - .../toml/burntsushi/valid/long-float.json | 4 - .../toml/burntsushi/valid/long-float.toml | 2 - .../toml/burntsushi/valid/long-integer.json | 4 - .../toml/burntsushi/valid/long-integer.toml | 2 - .../valid/multiline-string-modified.json | 30 - .../valid/multiline-string-modified.toml | 23 - .../burntsushi/valid/multiline-string.json | 30 - .../burntsushi/valid/multiline-string.toml | 23 - .../valid/raw-multiline-string.json | 14 - .../valid/raw-multiline-string.toml | 9 - .../toml/burntsushi/valid/raw-string.json | 30 - .../toml/burntsushi/valid/raw-string.toml | 7 - .../toml/burntsushi/valid/string-empty.json | 6 - .../toml/burntsushi/valid/string-empty.toml | 1 - .../valid/string-escapes-modified.json | 30 - .../valid/string-escapes-modified.toml | 7 - .../toml/burntsushi/valid/string-escapes.json | 34 -- .../toml/burntsushi/valid/string-escapes.toml | 8 - .../toml/burntsushi/valid/string-simple.json | 6 - .../toml/burntsushi/valid/string-simple.toml | 1 - .../burntsushi/valid/string-with-pound.json | 7 - .../burntsushi/valid/string-with-pound.toml | 2 - .../valid/table-array-implicit.json | 7 - .../valid/table-array-implicit.toml | 2 - .../burntsushi/valid/table-array-many.json | 16 - .../burntsushi/valid/table-array-many.toml | 11 - .../valid/table-array-nest-modified.json | 18 - .../valid/table-array-nest-modified.toml | 17 - .../burntsushi/valid/table-array-nest.json | 18 - .../burntsushi/valid/table-array-nest.toml | 17 - .../burntsushi/valid/table-array-one.json | 8 - .../burntsushi/valid/table-array-one.toml | 3 - .../toml/burntsushi/valid/table-empty.json | 3 - .../toml/burntsushi/valid/table-empty.toml | 1 - .../burntsushi/valid/table-sub-empty.json | 3 - .../burntsushi/valid/table-sub-empty.toml | 2 - .../burntsushi/valid/table-whitespace.json | 3 - .../burntsushi/valid/table-whitespace.toml | 1 - .../burntsushi/valid/table-with-pound.json | 5 - .../burntsushi/valid/table-with-pound.toml | 2 - .../toml/burntsushi/valid/unicode-escape.json | 3 - .../toml/burntsushi/valid/unicode-escape.toml | 1 - .../burntsushi/valid/unicode-literal.json | 3 - .../burntsushi/valid/unicode-literal.toml | 1 - .../com/moandjiezana/toml/example-v0.4.0.toml | 244 -------- .../com/moandjiezana/toml/example.toml | 36 -- .../moandjiezana/toml/fruit_table_array.toml | 18 - .../com/moandjiezana/toml/hard_example.toml | 33 - .../toml/hard_example_errors.toml | 11 - .../toml/products_table_array.toml | 10 - .../should_allow_comment_after_values.toml | 12 - ...ys_with_same_name_in_different_tables.toml | 4 - .../toml/should_allow_multiline_array.toml | 5 - .../toml/should_convert_extra_primitives.toml | 12 - .../toml/should_convert_primitive_values.toml | 5 - .../should_convert_table_array_to_class.toml | 10 - .../toml/should_convert_tables.toml | 5 - .../should_get_basic_multiline_string.toml | 5 - .../toml/should_get_literal_string.toml | 4 - .../should_get_multiline_literal_string.toml | 12 - ...et_multiline_string_without_new_lines.toml | 14 - .../toml/should_load_from_file.toml | 1 - ...should_parse_table_array_out_of_order.toml | 8 - ...should_support_array_of_inline_tables.toml | 5 - .../toml/should_support_blank_line.toml | 5 - ...support_special_characters_in_strings.toml | 3 - 236 files changed, 1960 insertions(+), 6667 deletions(-) create mode 100644 .gitignore delete mode 100644 .travis.yml create mode 100644 build.gradle.kts create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle.kts delete mode 100644 src/main/java/com/moandjiezana/toml/Identifier.java delete mode 100644 src/main/java/com/moandjiezana/toml/LiteralStringValueReader.java delete mode 100644 src/main/java/com/moandjiezana/toml/MapValueWriter.java delete mode 100644 src/main/java/com/moandjiezana/toml/ObjectValueWriter.java delete mode 100644 src/main/java/com/moandjiezana/toml/Toml.java delete mode 100644 src/main/java/com/moandjiezana/toml/TomlWriter.java delete mode 100644 src/main/java/com/moandjiezana/toml/ValueReaders.java delete mode 100644 src/main/java/com/moandjiezana/toml/ValueWriters.java delete mode 100644 src/main/java/com/moandjiezana/toml/WriterContext.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/ArrayValueReader.java (73%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/ArrayValueWriter.java (86%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/BooleanValueReaderWriter.java (97%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/Container.java (78%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/Context.java (50%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/DatePolicy.java (88%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/DateValueReaderWriter.java (97%) create mode 100644 src/main/java/dev/plex/toml/Identifier.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/IdentifierConverter.java (96%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/IndentationPolicy.java (92%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/InlineTableValueReader.java (76%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/Keys.java (95%) create mode 100644 src/main/java/dev/plex/toml/LiteralStringValueReader.java create mode 100644 src/main/java/dev/plex/toml/MapValueWriter.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/MultilineLiteralStringValueReader.java (93%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/MultilineStringValueReader.java (73%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/NumberValueReaderWriter.java (88%) create mode 100644 src/main/java/dev/plex/toml/ObjectValueWriter.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/PrimitiveArrayValueWriter.java (77%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/Results.java (92%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/StringValueReaderWriter.java (99%) rename src/main/java/{com/moandjiezana => dev/plex}/toml/TableArrayValueWriter.java (81%) create mode 100644 src/main/java/dev/plex/toml/Toml.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/TomlParser.java (71%) create mode 100644 src/main/java/dev/plex/toml/TomlWriter.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/ValueReader.java (72%) create mode 100644 src/main/java/dev/plex/toml/ValueReaders.java rename src/main/java/{com/moandjiezana => dev/plex}/toml/ValueWriter.java (82%) create mode 100644 src/main/java/dev/plex/toml/ValueWriters.java create mode 100644 src/main/java/dev/plex/toml/WriterContext.java delete mode 100644 src/test/java/com/moandjiezana/toml/ArrayTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/BareKeysTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/BooleanTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/BurntSushiInvalidTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/BurntSushiValidEncoderTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/BurntSushiValidTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/ContainsTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/DateTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/DefaultValueTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/ErrorMessagesTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/InlineTableTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/IterationTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/NumberTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/QuotedKeysTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/RealWorldTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/StringTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TableArrayTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TableTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TomlDefaultsTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TomlReadTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TomlTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TomlToClassTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/TomlWriterTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/UnicodeTest.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/ExtraPrimitives.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/FruitArray.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/TomlPrimitives.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/TomlTableArrays.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/TomlTables.java delete mode 100644 src/test/java/com/moandjiezana/toml/testutils/Utils.java delete mode 100644 src/test/resources/IteratorTest/list.toml delete mode 100644 src/test/resources/IteratorTest/long.toml delete mode 100644 src/test/resources/IteratorTest/multiple.toml delete mode 100644 src/test/resources/IteratorTest/table.toml delete mode 100644 src/test/resources/IteratorTest/table_array.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-arrays-and-ints.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-ints-and-floats.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-strings-and-ints.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-leads.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-secs.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-t.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-z.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-with-milli.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-key-table.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-keys.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-tables.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-implicit-table.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-table.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-leading-zero.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-trailing-digits.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-hash.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-newline.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-open-bracket.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-single-open-bracket.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-start-bracket.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-two-equals.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-byte-escape.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-escape.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-byte-escapes.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-no-close.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-implicit.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-bracket.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-close.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-open.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-array-entries.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-integer.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-table.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-before-array-separator.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-in-array.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.json delete mode 100644 src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/example-v0.4.0.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/example.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/fruit_table_array.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/hard_example.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/hard_example_errors.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/products_table_array.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_allow_comment_after_values.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_allow_keys_with_same_name_in_different_tables.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_allow_multiline_array.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_convert_extra_primitives.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_convert_primitive_values.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_convert_table_array_to_class.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_convert_tables.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_get_basic_multiline_string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_get_multiline_literal_string.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_get_multiline_string_without_new_lines.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_load_from_file.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_parse_table_array_out_of_order.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_support_array_of_inline_tables.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_support_blank_line.toml delete mode 100644 src/test/resources/com/moandjiezana/toml/should_support_special_characters_in_strings.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c426e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.gradle/ +/build/ +/.idea/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 81c8133..0000000 --- a/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: java -jdk: - - oraclejdk8 - - oraclejdk7 - - openjdk7 - - openjdk6 -after_success: - - mvn clean test jacoco:report coveralls:report diff --git a/CHANGELOG.md b/CHANGELOG.md index 8688624..157974a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # toml4j Changelog +## 0.7.3 / 2022-05-05 + +## Updated +* Added SeriaizedName annotation support +* Add proper indentation for array types +* Append object fields instead of overwriting the whole file + + ## 0.7.2 / 2017-08-05 ## Updated @@ -83,4 +91,4 @@ * Support for [TOML 0.2](https://github.com/toml-lang/toml/tree/v0.2.0) spec, most notably table arrays. ## 0.1 / 2014-04-06 -* Support for [TOML 0.1](https://github.com/toml-lang/toml/tree/v0.1.0) spec. +* Support for [TOML 0.1](https://github.com/toml-lang/toml/tree/v0.1.0) spec. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c6dd01f..2a4bc26 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,10 +1,8 @@ Thank you for taking the time to contribute to toml4j! Here are a few guidelines to streamline the process. * Pull Requests should be opened against the wip branch. Master changes only when there is a new release. -* Cover new or modified functionality with unit tests. Run `mvn test jacoco:report` and look at `target/site/jacoco/index.html` to view code coverage. * Amend README.md as necessary -* Update the UNRELEASED section of CHANGELOG.md, as described in [keepachangelog.com](http://keepachangelog.com) * Use 2 spaces for indentation * Opening braces, parentheses, etc. are not on a new line -If you are unsure about how something should be implemented, open a pull request and we'll discuss it. +If you are unsure about how something should be implemented, open a pull request and we'll discuss it. \ No newline at end of file diff --git a/LICENSE b/LICENSE index 764f747..174cd42 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2015 Moandji Ezana +Copyright (c) 2022 Plexus Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index debcc03..ccb94ac 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ toml4j is a [TOML 0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) parser for Java. -[![Maven Central](https://img.shields.io/maven-central/v/com.moandjiezana.toml/toml4j.svg)](https://search.maven.org/#search|gav|1|g%3A%22com.moandjiezana.toml%22%20AND%20a%3A%22toml4j%22) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Build Status](https://travis-ci.org/mwanji/toml4j.svg)](https://travis-ci.org/mwanji/toml4j) [![Coverage Status](https://coveralls.io/repos/mwanji/toml4j/badge.svg)](https://coveralls.io/r/mwanji/toml4j) [![Dependency Status](https://www.versioneye.com/user/projects/558bc2bc653232001e000001/badge.svg?style=flat)](https://www.versioneye.com/user/projects/558bc2bc653232001e000001) +[//]: # ([![Maven Central](https://img.shields.io/maven-central/v/com.moandjiezana.toml/toml4j.svg)](https://search.maven.org/#search|gav|1|g%3A%22com.moandjiezana.toml%22%20AND%20a%3A%22toml4j%22) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Build Status](https://travis-ci.org/mwanji/toml4j.svg)](https://travis-ci.org/mwanji/toml4j) [![Coverage Status](https://coveralls.io/repos/mwanji/toml4j/badge.svg)](https://coveralls.io/r/mwanji/toml4j) [![Dependency Status](https://www.versioneye.com/user/projects/558bc2bc653232001e000001/badge.svg?style=flat)](https://www.versioneye.com/user/projects/558bc2bc653232001e000001)) -For the bleeding-edge version integrating the latest specs, see the [work-in-progress branch](https://github.com/mwanji/toml4j/tree/wip). +[//]: # (For the bleeding-edge version integrating the latest specs, see the [work-in-progress branch](https://github.com/mwanji/toml4j/tree/wip).) ## Installation @@ -12,9 +12,9 @@ Add the following dependency to your POM (or equivalent for other dependency man ```xml - com.moandjiezana.toml + dev.plex toml4j - 0.7.2 + 0.7.3 ``` @@ -26,11 +26,11 @@ repositories { dependencies { ... - implementation 'com.moandjiezana.toml:toml4j:0.7.2' + implementation 'dev.plex:toml4j:0.7.3' } ``` -Requires Java 1.6 or above. +Requires Java 17 above. ## Quick start @@ -43,7 +43,7 @@ MyClass myClass = toml.to(MyClass.class); ## Usage -A `com.moandjiezana.toml.Toml` instance is populated by calling one of `read(File)`, `read(InputStream)`, `read(Reader)`, `read(String)` or `read(Toml)`. +A `dev.plex.Toml` instance is populated by calling one of `read(File)`, `read(InputStream)`, `read(Reader)`, `read(String)` or `read(Toml)`. ```java Toml toml = new Toml().read("a=1"); @@ -338,4 +338,4 @@ Please see the [contribution guidelines](CONTRIBUTING.md). ## License -toml4j is copyright (c) 2013-2015 Moandji Ezana and is licensed under the [MIT License](LICENSE) +toml4j is copyright (c) 2013-2015 Moandji Ezana and is licensed under the [MIT License](LICENSE) \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..dd2efe7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + java +} + +group = "dev.plex" +version = "0.7.3" + +repositories { + mavenCentral() +} + +dependencies { + implementation("com.google.code.gson:gson:2.9.0") + implementation("org.projectlombok:lombok:1.18.22") + annotationProcessor("org.projectlombok:lombok:1.18.22") +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ffed3a2 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..744e882 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f1939df..0000000 --- a/pom.xml +++ /dev/null @@ -1,161 +0,0 @@ - - 4.0.0 - com.moandjiezana.toml - toml4j - 0.7.3-SNAPSHOT - toml4j - A parser for TOML - http://moandjiezana.com/toml/toml4j - - - The MIT License - http://www.opensource.org/licenses/mit-license.php - repo - - - - scm:git:git@github.com:mwanji/toml4j.git - scm:git:git@github.com:mwanji/toml4j.git - https://github.com/mwanji/toml4j - HEAD - - - Github Issues - https://github.com/mwanji/toml4j/issues - - - Travis CI - https://travis-ci.org/mwanji/toml4j - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - - - moandji.ezana - Moandji Ezana - mwanji@gmail.com - - - 2013 - - - UTF-8 - - - - - junit - junit - 4.12 - test - - - com.google.code.gson - gson - 2.8.1 - - - org.hamcrest - hamcrest-library - 1.3 - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - 1.6 - 1.6 - - - - org.jacoco - jacoco-maven-plugin - 0.7.9 - - - prepare-agent - - prepare-agent - - - - - - org.eluder.coveralls - coveralls-maven-plugin - 4.3.0 - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.8 - true - - ossrh - https://oss.sonatype.org/ - true - - - - org.apache.maven.plugins - maven-release-plugin - 2.5.3 - - true - false - release - deploy - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.4 - - - attach-javadocs - - jar - - - - - - - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..10b2414 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "toml4j" + diff --git a/src/main/java/com/moandjiezana/toml/Identifier.java b/src/main/java/com/moandjiezana/toml/Identifier.java deleted file mode 100644 index af0b257..0000000 --- a/src/main/java/com/moandjiezana/toml/Identifier.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.moandjiezana.toml; - -class Identifier { - - static final Identifier INVALID = new Identifier("", null); - - private static final String ALLOWED_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-"; - - private final String name; - private final Type type; - - static Identifier from(String name, Context context) { - Type type; - boolean valid; - name = name.trim(); - if (name.startsWith("[[")) { - type = Type.TABLE_ARRAY; - valid = isValidTableArray(name, context); - } else if (name.startsWith("[")) { - type = Type.TABLE; - valid = isValidTable(name, context); - } else { - type = Type.KEY; - valid = isValidKey(name, context); - } - - if (!valid) { - return Identifier.INVALID; - } - - return new Identifier(extractName(name), type); - } - - private Identifier(String name, Type type) { - this.name = name; - this.type = type; - } - - String getName() { - return name; - } - - String getBareName() { - if (isKey()) { - return name; - } - - if (isTable()) { - return name.substring(1, name.length() - 1); - } - - return name.substring(2, name.length() - 2); - } - - boolean isKey() { - return type == Type.KEY; - } - - boolean isTable() { - return type == Type.TABLE; - } - - boolean isTableArray() { - return type == Type.TABLE_ARRAY; - } - - private static enum Type { - KEY, TABLE, TABLE_ARRAY; - } - - private static String extractName(String raw) { - boolean quoted = false; - StringBuilder sb = new StringBuilder(); - - for (int i = 0; i < raw.length(); i++) { - char c = raw.charAt(i); - if (c == '"' && (i == 0 || raw.charAt(i - 1) != '\\')) { - quoted = !quoted; - sb.append('"'); - } else if (quoted || !Character.isWhitespace(c)) { - sb.append(c); - } - } - - return StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceUnicodeCharacters(sb.toString()); - } - - private static boolean isValidKey(String name, Context context) { - if (name.trim().isEmpty()) { - context.errors.invalidKey(name, context.line.get()); - return false; - } - - boolean quoted = false; - for (int i = 0; i < name.length(); i++) { - char c = name.charAt(i); - - if (c == '"' && (i == 0 || name.charAt(i - 1) != '\\')) { - if (!quoted && i > 0 && name.charAt(i - 1) != '.') { - context.errors.invalidKey(name, context.line.get()); - return false; - } - quoted = !quoted; - } else if (!quoted && (ALLOWED_CHARS.indexOf(c) == -1)) { - context.errors.invalidKey(name, context.line.get()); - return false; - } - } - - return true; - } - - private static boolean isValidTable(String name, Context context) { - boolean valid = true; - - if (!name.endsWith("]")) { - valid = false; - } - - String trimmed = name.substring(1, name.length() - 1).trim(); - if (trimmed.isEmpty() || trimmed.charAt(0) == '.' || trimmed.endsWith(".")) { - valid = false; - } - - if (!valid) { - context.errors.invalidTable(name, context.line.get()); - return false; - } - - boolean quoted = false; - boolean dotAllowed = false; - boolean quoteAllowed = true; - boolean charAllowed = true; - - for (int i = 0; i < trimmed.length(); i++) { - char c = trimmed.charAt(i); - - if (!valid) { - break; - } - - if (Keys.isQuote(c)) { - if (!quoteAllowed) { - valid = false; - } else if (quoted && trimmed.charAt(i - 1) != '\\') { - charAllowed = false; - dotAllowed = true; - quoteAllowed = false; - } else if (!quoted) { - quoted = true; - quoteAllowed = true; - } - } else if (quoted) { - continue; - } else if (c == '.') { - if (dotAllowed) { - charAllowed = true; - dotAllowed = false; - quoteAllowed = true; - } else { - context.errors.emptyImplicitTable(name, context.line.get()); - return false; - } - } else if (Character.isWhitespace(c)) { - char prev = trimmed.charAt(i - 1); - if (!Character.isWhitespace(prev) && prev != '.') { - charAllowed = false; - dotAllowed = true; - quoteAllowed = true; - } - } else { - if (charAllowed && ALLOWED_CHARS.indexOf(c) > -1) { - charAllowed = true; - dotAllowed = true; - quoteAllowed = false; - } else { - valid = false; - } - } - } - - if (!valid) { - context.errors.invalidTable(name, context.line.get()); - return false; - } - - return true; - } - - private static boolean isValidTableArray(String line, Context context) { - boolean valid = true; - - if (!line.endsWith("]]")) { - valid = false; - } - - String trimmed = line.substring(2, line.length() - 2).trim(); - if (trimmed.isEmpty() || trimmed.charAt(0) == '.' || trimmed.endsWith(".")) { - valid = false; - } - - if (!valid) { - context.errors.invalidTableArray(line, context.line.get()); - return false; - } - - boolean quoted = false; - boolean dotAllowed = false; - boolean quoteAllowed = true; - boolean charAllowed = true; - - for (int i = 0; i < trimmed.length(); i++) { - char c = trimmed.charAt(i); - - if (!valid) { - break; - } - - if (c == '"') { - if (!quoteAllowed) { - valid = false; - } else if (quoted && trimmed.charAt(i - 1) != '\\') { - charAllowed = false; - dotAllowed = true; - quoteAllowed = false; - } else if (!quoted) { - quoted = true; - quoteAllowed = true; - } - } else if (quoted) { - continue; - } else if (c == '.') { - if (dotAllowed) { - charAllowed = true; - dotAllowed = false; - quoteAllowed = true; - } else { - context.errors.emptyImplicitTable(line, context.line.get()); - return false; - } - } else if (Character.isWhitespace(c)) { - char prev = trimmed.charAt(i - 1); - if (!Character.isWhitespace(prev) && prev != '.' && prev != '"') { - charAllowed = false; - dotAllowed = true; - quoteAllowed = true; - } - } else { - if (charAllowed && ALLOWED_CHARS.indexOf(c) > -1) { - charAllowed = true; - dotAllowed = true; - quoteAllowed = false; - } else { - valid = false; - } - } - } - - if (!valid) { - context.errors.invalidTableArray(line, context.line.get()); - return false; - } - - return true; - } -} diff --git a/src/main/java/com/moandjiezana/toml/LiteralStringValueReader.java b/src/main/java/com/moandjiezana/toml/LiteralStringValueReader.java deleted file mode 100644 index 87ad166..0000000 --- a/src/main/java/com/moandjiezana/toml/LiteralStringValueReader.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.moandjiezana.toml; - -import java.util.concurrent.atomic.AtomicInteger; - - -class LiteralStringValueReader implements ValueReader { - - static final LiteralStringValueReader LITERAL_STRING_VALUE_READER = new LiteralStringValueReader(); - - @Override - public boolean canRead(String s) { - return s.startsWith("'"); - } - - @Override - public Object read(String s, AtomicInteger index, Context context) { - int startLine = context.line.get(); - boolean terminated = false; - int startIndex = index.incrementAndGet(); - - for (int i = index.get(); i < s.length(); i = index.incrementAndGet()) { - char c = s.charAt(i); - - if (c == '\'') { - terminated = true; - break; - } - } - - if (!terminated) { - Results.Errors errors = new Results.Errors(); - errors.unterminated(context.identifier.getName(), s.substring(startIndex), startLine); - return errors; - } - - String substring = s.substring(startIndex, index.get()); - - return substring; - } - - private LiteralStringValueReader() {} -} diff --git a/src/main/java/com/moandjiezana/toml/MapValueWriter.java b/src/main/java/com/moandjiezana/toml/MapValueWriter.java deleted file mode 100644 index 4e6ec79..0000000 --- a/src/main/java/com/moandjiezana/toml/MapValueWriter.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.PrimitiveArrayValueWriter.PRIMITIVE_ARRAY_VALUE_WRITER; -import static com.moandjiezana.toml.TableArrayValueWriter.TABLE_ARRAY_VALUE_WRITER; -import static com.moandjiezana.toml.ValueWriters.WRITERS; - -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -class MapValueWriter implements ValueWriter { - static final ValueWriter MAP_VALUE_WRITER = new MapValueWriter(); - - private static final Pattern REQUIRED_QUOTING_PATTERN = Pattern.compile("^.*[^A-Za-z\\d_-].*$"); - - @Override - public boolean canWrite(Object value) { - return value instanceof Map; - } - - @Override - public void write(Object value, WriterContext context) { - Map from = (Map) value; - - if (hasPrimitiveValues(from, context)) { - context.writeKey(); - } - - // Render primitive types and arrays of primitive first so they are - // grouped under the same table (if there is one) - for (Map.Entry entry : from.entrySet()) { - Object key = entry.getKey(); - Object fromValue = entry.getValue(); - if (fromValue == null) { - continue; - } - - ValueWriter valueWriter = WRITERS.findWriterFor(fromValue); - if (valueWriter.isPrimitiveType()) { - context.indent(); - context.write(quoteKey(key)).write(" = "); - valueWriter.write(fromValue, context); - context.write('\n'); - } else if (valueWriter == PRIMITIVE_ARRAY_VALUE_WRITER) { - context.setArrayKey(key.toString()); - context.write(quoteKey(key)).write(" = "); - valueWriter.write(fromValue, context); - context.write('\n'); - } - } - - // Now render (sub)tables and arrays of tables - for (Object key : from.keySet()) { - Object fromValue = from.get(key); - if (fromValue == null) { - continue; - } - - ValueWriter valueWriter = WRITERS.findWriterFor(fromValue); - if (valueWriter == this || valueWriter == ObjectValueWriter.OBJECT_VALUE_WRITER || valueWriter == TABLE_ARRAY_VALUE_WRITER) { - valueWriter.write(fromValue, context.pushTable(quoteKey(key))); - } - } - } - - @Override - public boolean isPrimitiveType() { - return false; - } - - private static String quoteKey(Object key) { - String stringKey = key.toString(); - Matcher matcher = REQUIRED_QUOTING_PATTERN.matcher(stringKey); - if (matcher.matches()) { - stringKey = "\"" + stringKey + "\""; - } - - return stringKey; - } - - private static boolean hasPrimitiveValues(Map values, WriterContext context) { - for (Object key : values.keySet()) { - Object fromValue = values.get(key); - if (fromValue == null) { - continue; - } - - ValueWriter valueWriter = WRITERS.findWriterFor(fromValue); - if (valueWriter.isPrimitiveType() || valueWriter == PRIMITIVE_ARRAY_VALUE_WRITER) { - return true; - } - } - - return false; - } - - private MapValueWriter() {} -} diff --git a/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java b/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java deleted file mode 100644 index 1295778..0000000 --- a/src/main/java/com/moandjiezana/toml/ObjectValueWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.MapValueWriter.MAP_VALUE_WRITER; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.Arrays; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -class ObjectValueWriter implements ValueWriter { - static final ValueWriter OBJECT_VALUE_WRITER = new ObjectValueWriter(); - - @Override - public boolean canWrite(Object value) { - return true; - } - - @Override - public void write(Object value, WriterContext context) { - Map to = new LinkedHashMap(); - Set fields = getFields(value.getClass()); - for (Field field : fields) { - to.put(field.getName(), getFieldValue(field, value)); - } - - MAP_VALUE_WRITER.write(to, context); - } - - @Override - public boolean isPrimitiveType() { - return false; - } - - private static Set getFields(Class cls) { - Set fields = new LinkedHashSet(Arrays.asList(cls.getDeclaredFields())); - while (cls != Object.class) { - fields.addAll(Arrays.asList(cls.getDeclaredFields())); - cls = cls.getSuperclass(); - } - removeConstantsAndSyntheticFields(fields); - - return fields; - } - - private static void removeConstantsAndSyntheticFields(Set fields) { - Iterator iterator = fields.iterator(); - while (iterator.hasNext()) { - Field field = iterator.next(); - if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers())) { - iterator.remove(); - } - } - } - - private static Object getFieldValue(Field field, Object o) { - boolean isAccessible = field.isAccessible(); - field.setAccessible(true); - Object value = null; - try { - value = field.get(o); - } catch (IllegalAccessException ignored) { - } - field.setAccessible(isAccessible); - - return value; - } - - private ObjectValueWriter() {} -} diff --git a/src/main/java/com/moandjiezana/toml/Toml.java b/src/main/java/com/moandjiezana/toml/Toml.java deleted file mode 100644 index 685686d..0000000 --- a/src/main/java/com/moandjiezana/toml/Toml.java +++ /dev/null @@ -1,429 +0,0 @@ -package com.moandjiezana.toml; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; - -/** - *

Provides access to the keys and tables in a TOML data source.

- * - *

All getters can fall back to default values if they have been provided as a constructor argument. - * Getters for simple values (String, Date, etc.) will return null if no matching key exists. - * {@link #getList(String)}, {@link #getTable(String)} and {@link #getTables(String)} return empty values if there is no matching key.

- * - *

All read methods throw an {@link IllegalStateException} if the TOML is incorrect.

- * - *

Example usage:

- *

- * Toml toml = new Toml().read(getTomlFile());
- * String name = toml.getString("name");
- * Long port = toml.getLong("server.ip"); // compound key. Is equivalent to:
- * Long port2 = toml.getTable("server").getLong("ip");
- * MyConfig config = toml.to(MyConfig.class);
- * 
- * - */ -public class Toml { - - private static final Gson DEFAULT_GSON = new Gson(); - - private Map values = new HashMap(); - private final Toml defaults; - - /** - * Creates Toml instance with no defaults. - */ - public Toml() { - this(null); - } - - /** - * @param defaults fallback values used when the requested key or table is not present in the TOML source that has been read. - */ - public Toml(Toml defaults) { - this(defaults, new HashMap()); - } - - /** - * Populates the current Toml instance with values from file. - * - * @param file The File to be read. Expected to be encoded as UTF-8. - * @return this instance - * @throws IllegalStateException If file contains invalid TOML - */ - public Toml read(File file) { - try { - return read(new InputStreamReader(new FileInputStream(file), "UTF8")); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Populates the current Toml instance with values from inputStream. - * - * @param inputStream Closed after it has been read. - * @return this instance - * @throws IllegalStateException If file contains invalid TOML - */ - public Toml read(InputStream inputStream) { - return read(new InputStreamReader(inputStream)); - } - - /** - * Populates the current Toml instance with values from reader. - * - * @param reader Closed after it has been read. - * @return this instance - * @throws IllegalStateException If file contains invalid TOML - */ - public Toml read(Reader reader) { - BufferedReader bufferedReader = null; - try { - bufferedReader = new BufferedReader(reader); - - StringBuilder w = new StringBuilder(); - String line = bufferedReader.readLine(); - while (line != null) { - w.append(line).append('\n'); - line = bufferedReader.readLine(); - } - read(w.toString()); - } catch (IOException e) { - throw new RuntimeException(e); - } finally { - try { - bufferedReader.close(); - } catch (IOException e) {} - } - return this; - } - - /** - * Populates the current Toml instance with values from otherToml. - * - * @param otherToml - * @return this instance - */ - public Toml read(Toml otherToml) { - this.values = otherToml.values; - - return this; - } - - /** - * Populates the current Toml instance with values from tomlString. - * - * @param tomlString String to be read. - * @return this instance - * @throws IllegalStateException If tomlString is not valid TOML - */ - public Toml read(String tomlString) throws IllegalStateException { - Results results = TomlParser.run(tomlString); - if (results.errors.hasErrors()) { - throw new IllegalStateException(results.errors.toString()); - } - - this.values = results.consume(); - - return this; - } - - public String getString(String key) { - return (String) get(key); - } - - public String getString(String key, String defaultValue) { - String val = getString(key); - return val == null ? defaultValue : val; - } - - public Long getLong(String key) { - return (Long) get(key); - } - - public Long getLong(String key, Long defaultValue) { - Long val = getLong(key); - return val == null ? defaultValue : val; - } - - /** - * @param key a TOML key - * @param type of list items - * @return null if the key is not found - */ - public List getList(String key) { - @SuppressWarnings("unchecked") - List list = (List) get(key); - - return list; - } - - /** - * @param key a TOML key - * @param defaultValue a list of default values - * @param type of list items - * @return null is the key is not found - */ - public List getList(String key, List defaultValue) { - List list = getList(key); - - return list != null ? list : defaultValue; - } - - public Boolean getBoolean(String key) { - return (Boolean) get(key); - } - - public Boolean getBoolean(String key, Boolean defaultValue) { - Boolean val = getBoolean(key); - return val == null ? defaultValue : val; - } - - public Date getDate(String key) { - return (Date) get(key); - } - - public Date getDate(String key, Date defaultValue) { - Date val = getDate(key); - return val == null ? defaultValue : val; - } - - public Double getDouble(String key) { - return (Double) get(key); - } - - public Double getDouble(String key, Double defaultValue) { - Double val = getDouble(key); - return val == null ? defaultValue : val; - } - - /** - * @param key A table name, not including square brackets. - * @return A new Toml instance or null if no value is found for key. - */ - @SuppressWarnings("unchecked") - public Toml getTable(String key) { - Map map = (Map) get(key); - - return map != null ? new Toml(null, map) : null; - } - - /** - * @param key Name of array of tables, not including square brackets. - * @return A {@link List} of Toml instances or null if no value is found for key. - */ - @SuppressWarnings("unchecked") - public List getTables(String key) { - List> tableArray = (List>) get(key); - - if (tableArray == null) { - return null; - } - - ArrayList tables = new ArrayList(); - - for (Map table : tableArray) { - tables.add(new Toml(null, table)); - } - - return tables; - } - - /** - * @param key a key name, can be compound (eg. a.b.c) - * @return true if key is present - */ - public boolean contains(String key) { - return get(key) != null; - } - - /** - * @param key a key name, can be compound (eg. a.b.c) - * @return true if key is present and is a primitive - */ - public boolean containsPrimitive(String key) { - Object object = get(key); - - return object != null && !(object instanceof Map) && !(object instanceof List); - } - - /** - * @param key a key name, can be compound (eg. a.b.c) - * @return true if key is present and is a table - */ - public boolean containsTable(String key) { - Object object = get(key); - - return object != null && (object instanceof Map); - } - - /** - * @param key a key name, can be compound (eg. a.b.c) - * @return true if key is present and is a table array - */ - public boolean containsTableArray(String key) { - Object object = get(key); - - return object != null && (object instanceof List); - } - - public boolean isEmpty() { - return values.isEmpty(); - } - - /** - *

- * Populates an instance of targetClass with the values of this Toml instance. - * The target's field names must match keys or tables. - * Keys not present in targetClass will be ignored. - *

- * - *

Tables are recursively converted to custom classes or to {@link Map Map<String, Object>}.

- * - *

In addition to straight-forward conversion of TOML primitives, the following are also available:

- * - *
    - *
  • Integer -> int, long (or wrapper), {@link java.math.BigInteger}
  • - *
  • Float -> float, double (or wrapper), {@link java.math.BigDecimal}
  • - *
  • One-letter String -> char, {@link Character}
  • - *
  • String -> {@link String}, enum, {@link java.net.URI}, {@link java.net.URL}
  • - *
  • Multiline and Literal Strings -> {@link String}
  • - *
  • Array -> {@link List}, {@link Set}, array. The generic type can be anything that can be converted.
  • - *
  • Table -> Custom class, {@link Map Map<String, Object>}
  • - *
- * - * @param targetClass Class to deserialize TOML to. - * @param type of targetClass. - * @return A new instance of targetClass. - */ - public T to(Class targetClass) { - JsonElement json = DEFAULT_GSON.toJsonTree(toMap()); - - if (targetClass == JsonElement.class) { - return targetClass.cast(json); - } - - return DEFAULT_GSON.fromJson(json, targetClass); - } - - public Map toMap() { - HashMap valuesCopy = new HashMap(values); - - if (defaults != null) { - for (Map.Entry entry : defaults.values.entrySet()) { - if (!valuesCopy.containsKey(entry.getKey())) { - valuesCopy.put(entry.getKey(), entry.getValue()); - } - } - } - - return valuesCopy; - } - - /** - * @return a {@link Set} of Map.Entry instances. Modifications to the {@link Set} are not reflected in this Toml instance. Entries are immutable, so {@link Map.Entry#setValue(Object)} throws an UnsupportedOperationException. - */ - public Set> entrySet() { - Set> entries = new LinkedHashSet>(); - - for (Map.Entry entry : values.entrySet()) { - Class entryClass = entry.getValue().getClass(); - - if (Map.class.isAssignableFrom(entryClass)) { - entries.add(new Toml.Entry(entry.getKey(), getTable(entry.getKey()))); - } else if (List.class.isAssignableFrom(entryClass)) { - List value = (List) entry.getValue(); - if (!value.isEmpty() && value.get(0) instanceof Map) { - entries.add(new Toml.Entry(entry.getKey(), getTables(entry.getKey()))); - } else { - entries.add(new Toml.Entry(entry.getKey(), value)); - } - } else { - entries.add(new Toml.Entry(entry.getKey(), entry.getValue())); - } - } - - return entries; - } - - private class Entry implements Map.Entry { - - private final String key; - private final Object value; - - @Override - public String getKey() { - return key; - } - - @Override - public Object getValue() { - return value; - } - - @Override - public Object setValue(Object value) { - throw new UnsupportedOperationException("TOML entry values cannot be changed."); - } - - private Entry(String key, Object value) { - this.key = key; - this.value = value; - } - } - - @SuppressWarnings("unchecked") - private Object get(String key) { - if (values.containsKey(key)) { - return values.get(key); - } - - Object current = new HashMap(values); - - Keys.Key[] keys = Keys.split(key); - - for (Keys.Key k : keys) { - if (k.index == -1 && current instanceof Map && ((Map) current).containsKey(k.path)) { - return ((Map) current).get(k.path); - } - - current = ((Map) current).get(k.name); - - if (k.index > -1 && current != null) { - if (k.index >= ((List) current).size()) { - return null; - } - - current = ((List) current).get(k.index); - } - - if (current == null) { - return defaults != null ? defaults.get(key) : null; - } - } - - return current; - } - - private Toml(Toml defaults, Map values) { - this.values = values; - this.defaults = defaults; - } -} diff --git a/src/main/java/com/moandjiezana/toml/TomlWriter.java b/src/main/java/com/moandjiezana/toml/TomlWriter.java deleted file mode 100644 index ceb1dd2..0000000 --- a/src/main/java/com/moandjiezana/toml/TomlWriter.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.MapValueWriter.MAP_VALUE_WRITER; -import static com.moandjiezana.toml.ObjectValueWriter.OBJECT_VALUE_WRITER; -import static com.moandjiezana.toml.ValueWriters.WRITERS; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.StringWriter; -import java.io.Writer; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -/** - *

Converts Objects to TOML

- * - *

An input Object can comprise arbitrarily nested combinations of Java primitive types, - * other {@link Object}s, {@link Map}s, {@link List}s, and Arrays. {@link Object}s and {@link Map}s - * are output to TOML tables, and {@link List}s and Array to TOML arrays.

- * - *

Example usage:

- *

- * class AClass {
- *   int anInt = 1;
- *   int[] anArray = { 2, 3 };
- * }
- *
- * String tomlString = new TomlWriter().write(new AClass());
- * 
- */ -public class TomlWriter { - - public static class Builder { - private int keyIndentation; - private int tableIndentation; - private int arrayDelimiterPadding = 0; - private TimeZone timeZone = TimeZone.getTimeZone("UTC"); - private boolean showFractionalSeconds = false; - - public TomlWriter.Builder indentValuesBy(int spaces) { - this.keyIndentation = spaces; - - return this; - } - - public TomlWriter.Builder indentTablesBy(int spaces) { - this.tableIndentation = spaces; - - return this; - } - - public TomlWriter.Builder timeZone(TimeZone timeZone) { - this.timeZone = timeZone; - - return this; - } - - /** - * @param spaces number of spaces to put between opening square bracket and first item and between closing square bracket and last item - * @return this TomlWriter.Builder instance - */ - public TomlWriter.Builder padArrayDelimitersBy(int spaces) { - this.arrayDelimiterPadding = spaces; - - return this; - } - - public TomlWriter build() { - return new TomlWriter(keyIndentation, tableIndentation, arrayDelimiterPadding, timeZone, showFractionalSeconds); - } - - public TomlWriter.Builder showFractionalSeconds() { - this.showFractionalSeconds = true; - return this; - } - } - - private final IndentationPolicy indentationPolicy; - private final DatePolicy datePolicy; - - /** - * Creates a TomlWriter instance. - */ - public TomlWriter() { - this(0, 0, 0, TimeZone.getTimeZone("UTC"), false); - } - - private TomlWriter(int keyIndentation, int tableIndentation, int arrayDelimiterPadding, TimeZone timeZone, boolean showFractionalSeconds) { - this.indentationPolicy = new IndentationPolicy(keyIndentation, tableIndentation, arrayDelimiterPadding); - this.datePolicy = new DatePolicy(timeZone, showFractionalSeconds); - } - - /** - * Write an Object into TOML String. - * - * @param from the object to be written - * @return a string containing the TOML representation of the given Object - */ - public String write(Object from) { - try { - StringWriter output = new StringWriter(); - write(from, output); - - return output.toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Write an Object in TOML to a {@link File}. Output is encoded as UTF-8. - * - * @param from the object to be written - * @param target the File to which the TOML will be written - * @throws IOException if any file operations fail - */ - public void write(Object from, File target) throws IOException { - OutputStream outputStream = new FileOutputStream(target); - try { - write(from, outputStream); - } finally { - outputStream.close(); - } - } - - /** - * Write an Object in TOML to a {@link OutputStream}. Output is encoded as UTF-8. - * - * @param from the object to be written - * @param target the OutputStream to which the TOML will be written. The stream is NOT closed after being written to. - * @throws IOException if target.write() fails - */ - public void write(Object from, OutputStream target) throws IOException { - OutputStreamWriter writer = new OutputStreamWriter(target, "UTF-8"); - write(from, writer); - writer.flush(); - } - - /** - * Write an Object in TOML to a {@link Writer}. You MUST ensure that the {@link Writer}s's encoding is set to UTF-8 for the TOML to be valid. - * - * @param from the object to be written. Can be a Map or a custom type. Must not be null. - * @param target the Writer to which TOML will be written. The Writer is not closed. - * @throws IOException if target.write() fails - * @throws IllegalArgumentException if from is of an invalid type - */ - public void write(Object from, Writer target) throws IOException { - ValueWriter valueWriter = WRITERS.findWriterFor(from); - if (valueWriter == MAP_VALUE_WRITER || valueWriter == OBJECT_VALUE_WRITER) { - WriterContext context = new WriterContext(indentationPolicy, datePolicy, target); - valueWriter.write(from, context); - } else { - throw new IllegalArgumentException("An object of class " + from.getClass().getSimpleName() + " cannot produce valid TOML. Please pass in a Map or a custom type."); - } - } -} diff --git a/src/main/java/com/moandjiezana/toml/ValueReaders.java b/src/main/java/com/moandjiezana/toml/ValueReaders.java deleted file mode 100644 index 2583d36..0000000 --- a/src/main/java/com/moandjiezana/toml/ValueReaders.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.ArrayValueReader.ARRAY_VALUE_READER; -import static com.moandjiezana.toml.BooleanValueReaderWriter.BOOLEAN_VALUE_READER_WRITER; -import static com.moandjiezana.toml.DateValueReaderWriter.DATE_VALUE_READER_WRITER; -import static com.moandjiezana.toml.InlineTableValueReader.INLINE_TABLE_VALUE_READER; -import static com.moandjiezana.toml.LiteralStringValueReader.LITERAL_STRING_VALUE_READER; -import static com.moandjiezana.toml.MultilineLiteralStringValueReader.MULTILINE_LITERAL_STRING_VALUE_READER; -import static com.moandjiezana.toml.MultilineStringValueReader.MULTILINE_STRING_VALUE_READER; -import static com.moandjiezana.toml.NumberValueReaderWriter.NUMBER_VALUE_READER_WRITER; -import static com.moandjiezana.toml.StringValueReaderWriter.STRING_VALUE_READER_WRITER; - -import java.util.concurrent.atomic.AtomicInteger; - -class ValueReaders { - - static final ValueReaders VALUE_READERS = new ValueReaders(); - - Object convert(String value, AtomicInteger index, Context context) { - String substring = value.substring(index.get()); - for (ValueReader valueParser : READERS) { - if (valueParser.canRead(substring)) { - return valueParser.read(value, index, context); - } - } - - Results.Errors errors = new Results.Errors(); - errors.invalidValue(context.identifier.getName(), substring, context.line.get()); - return errors; - } - - private ValueReaders() {} - - private static final ValueReader[] READERS = { - MULTILINE_STRING_VALUE_READER, MULTILINE_LITERAL_STRING_VALUE_READER, LITERAL_STRING_VALUE_READER, STRING_VALUE_READER_WRITER, DATE_VALUE_READER_WRITER, NUMBER_VALUE_READER_WRITER, BOOLEAN_VALUE_READER_WRITER, ARRAY_VALUE_READER, INLINE_TABLE_VALUE_READER - }; -} diff --git a/src/main/java/com/moandjiezana/toml/ValueWriters.java b/src/main/java/com/moandjiezana/toml/ValueWriters.java deleted file mode 100644 index 51052fa..0000000 --- a/src/main/java/com/moandjiezana/toml/ValueWriters.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.BooleanValueReaderWriter.BOOLEAN_VALUE_READER_WRITER; -import static com.moandjiezana.toml.DateValueReaderWriter.DATE_PARSER_JDK_6; -import static com.moandjiezana.toml.DateValueReaderWriter.DATE_VALUE_READER_WRITER; -import static com.moandjiezana.toml.MapValueWriter.MAP_VALUE_WRITER; -import static com.moandjiezana.toml.NumberValueReaderWriter.NUMBER_VALUE_READER_WRITER; -import static com.moandjiezana.toml.ObjectValueWriter.OBJECT_VALUE_WRITER; -import static com.moandjiezana.toml.PrimitiveArrayValueWriter.PRIMITIVE_ARRAY_VALUE_WRITER; -import static com.moandjiezana.toml.StringValueReaderWriter.STRING_VALUE_READER_WRITER; -import static com.moandjiezana.toml.TableArrayValueWriter.TABLE_ARRAY_VALUE_WRITER; - -class ValueWriters { - - static final ValueWriters WRITERS = new ValueWriters(); - - ValueWriter findWriterFor(Object value) { - for (ValueWriter valueWriter : VALUE_WRITERS) { - if (valueWriter.canWrite(value)) { - return valueWriter; - } - } - - return OBJECT_VALUE_WRITER; - } - - private ValueWriters() {} - - private static DateValueReaderWriter getPlatformSpecificDateConverter() { - String specificationVersion = Runtime.class.getPackage().getSpecificationVersion(); - return specificationVersion != null && specificationVersion.startsWith("1.6") ? DATE_PARSER_JDK_6 : DATE_VALUE_READER_WRITER; - } - - private static final ValueWriter[] VALUE_WRITERS = { - STRING_VALUE_READER_WRITER, NUMBER_VALUE_READER_WRITER, BOOLEAN_VALUE_READER_WRITER, getPlatformSpecificDateConverter(), - MAP_VALUE_WRITER, PRIMITIVE_ARRAY_VALUE_WRITER, TABLE_ARRAY_VALUE_WRITER - }; -} diff --git a/src/main/java/com/moandjiezana/toml/WriterContext.java b/src/main/java/com/moandjiezana/toml/WriterContext.java deleted file mode 100644 index 1c358c6..0000000 --- a/src/main/java/com/moandjiezana/toml/WriterContext.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.moandjiezana.toml; - -import java.io.IOException; -import java.io.Writer; -import java.util.Arrays; - -class WriterContext { - private String arrayKey = null; - private boolean isArrayOfTable = false; - private boolean empty = true; - private final String key; - private final String currentTableIndent; - private final String currentFieldIndent; - private final Writer output; - private final IndentationPolicy indentationPolicy; - private final DatePolicy datePolicy; - - WriterContext(IndentationPolicy indentationPolicy, DatePolicy datePolicy, Writer output) { - this("", "", output, indentationPolicy, datePolicy); - } - - WriterContext pushTable(String newKey) { - String newIndent = ""; - if (!key.isEmpty()) { - newIndent = growIndent(indentationPolicy); - } - - String fullKey = key.isEmpty() ? newKey : key + "." + newKey; - - WriterContext subContext = new WriterContext(fullKey, newIndent, output, indentationPolicy, datePolicy); - if (!empty) { - subContext.empty = false; - } - - return subContext; - } - - WriterContext pushTableFromArray() { - WriterContext subContext = new WriterContext(key, currentTableIndent, output, indentationPolicy, datePolicy); - if (!empty) { - subContext.empty = false; - } - subContext.setIsArrayOfTable(true); - - return subContext; - } - - WriterContext write(String s) { - try { - output.write(s); - if (empty && !s.isEmpty()) { - empty = false; - } - - return this; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - void write(char[] chars) { - for (char c : chars) { - write(c); - } - } - - WriterContext write(char c) { - try { - output.write(c); - empty = false; - - return this; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - void writeKey() { - if (key.isEmpty()) { - return; - } - - if (!empty) { - write('\n'); - } - - write(currentTableIndent); - - if (isArrayOfTable) { - write("[[").write(key).write("]]\n"); - } else { - write('[').write(key).write("]\n"); - } - } - - void writeArrayDelimiterPadding() { - for (int i = 0; i < indentationPolicy.getArrayDelimiterPadding(); i++) { - write(' '); - } - } - - void indent() { - if (!key.isEmpty()) { - write(currentFieldIndent); - } - } - - DatePolicy getDatePolicy() { - return datePolicy; - } - - WriterContext setIsArrayOfTable(boolean isArrayOfTable) { - this.isArrayOfTable = isArrayOfTable; - return this; - } - - WriterContext setArrayKey(String arrayKey) { - this.arrayKey = arrayKey; - return this; - } - - String getContextPath() { - return key.isEmpty() ? arrayKey : key + "." + arrayKey; - } - - private String growIndent(IndentationPolicy indentationPolicy) { - return currentTableIndent + fillStringWithSpaces(indentationPolicy.getTableIndent()); - } - - private String fillStringWithSpaces(int count) { - char[] chars = new char[count]; - Arrays.fill(chars, ' '); - - return new String(chars); - } - - private WriterContext(String key, String tableIndent, Writer output, IndentationPolicy indentationPolicy, DatePolicy datePolicy) { - this.key = key; - this.output = output; - this.indentationPolicy = indentationPolicy; - this.currentTableIndent = tableIndent; - this.datePolicy = datePolicy; - this.currentFieldIndent = tableIndent + fillStringWithSpaces(this.indentationPolicy.getKeyValueIndent()); - } -} diff --git a/src/main/java/com/moandjiezana/toml/ArrayValueReader.java b/src/main/java/dev/plex/toml/ArrayValueReader.java similarity index 73% rename from src/main/java/com/moandjiezana/toml/ArrayValueReader.java rename to src/main/java/dev/plex/toml/ArrayValueReader.java index 19b20a3..d33503a 100644 --- a/src/main/java/com/moandjiezana/toml/ArrayValueReader.java +++ b/src/main/java/dev/plex/toml/ArrayValueReader.java @@ -1,29 +1,26 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.ValueReaders.VALUE_READERS; +package dev.plex.toml; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; -class ArrayValueReader implements ValueReader { - - static final ArrayValueReader ARRAY_VALUE_READER = new ArrayValueReader(); +public class ArrayValueReader implements ValueReader { + public static final ArrayValueReader ARRAY_VALUE_READER = new ArrayValueReader(); @Override public boolean canRead(String s) { return s.startsWith("["); } @Override - public Object read(String s, AtomicInteger index, Context context) { + public Object read(String s, AtomicInteger index, dev.plex.toml.Context context) { AtomicInteger line = context.line; int startLine = line.get(); int startIndex = index.get(); List arrayItems = new ArrayList(); boolean terminated = false; boolean inComment = false; - Results.Errors errors = new Results.Errors(); + dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors(); for (int i = index.incrementAndGet(); i < s.length(); i = index.incrementAndGet()) { @@ -38,8 +35,8 @@ class ArrayValueReader implements ValueReader { continue; } else if (c == '[') { Object converted = read(s, index, context); - if (converted instanceof Results.Errors) { - errors.add((Results.Errors) converted); + if (converted instanceof dev.plex.toml.Results.Errors) { + errors.add((dev.plex.toml.Results.Errors) converted); } else if (!isHomogenousArray(converted, arrayItems)) { errors.heterogenous(context.identifier.getName(), line.get()); } else { @@ -50,9 +47,9 @@ class ArrayValueReader implements ValueReader { terminated = true; break; } else { - Object converted = VALUE_READERS.convert(s, index, context); - if (converted instanceof Results.Errors) { - errors.add((Results.Errors) converted); + Object converted = ValueReaders.VALUE_READERS.convert(s, index, context); + if (converted instanceof dev.plex.toml.Results.Errors) { + errors.add((dev.plex.toml.Results.Errors) converted); } else if (!isHomogenousArray(converted, arrayItems)) { errors.heterogenous(context.identifier.getName(), line.get()); } else { diff --git a/src/main/java/com/moandjiezana/toml/ArrayValueWriter.java b/src/main/java/dev/plex/toml/ArrayValueWriter.java similarity index 86% rename from src/main/java/com/moandjiezana/toml/ArrayValueWriter.java rename to src/main/java/dev/plex/toml/ArrayValueWriter.java index c5de0c5..5973fef 100644 --- a/src/main/java/com/moandjiezana/toml/ArrayValueWriter.java +++ b/src/main/java/dev/plex/toml/ArrayValueWriter.java @@ -1,13 +1,14 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; -import static com.moandjiezana.toml.ValueWriters.WRITERS; +import static dev.plex.toml.ValueWriters.WRITERS; -abstract class ArrayValueWriter implements ValueWriter { +public abstract class ArrayValueWriter implements dev.plex.toml.ValueWriter +{ static protected boolean isArrayish(Object value) { return value instanceof Collection || value.getClass().isArray(); } @@ -20,7 +21,7 @@ abstract class ArrayValueWriter implements ValueWriter { static boolean isArrayOfPrimitive(Object array) { Object first = peek(array); if (first != null) { - ValueWriter valueWriter = WRITERS.findWriterFor(first); + dev.plex.toml.ValueWriter valueWriter = WRITERS.findWriterFor(first); return valueWriter.isPrimitiveType() || isArrayish(first); } diff --git a/src/main/java/com/moandjiezana/toml/BooleanValueReaderWriter.java b/src/main/java/dev/plex/toml/BooleanValueReaderWriter.java similarity index 97% rename from src/main/java/com/moandjiezana/toml/BooleanValueReaderWriter.java rename to src/main/java/dev/plex/toml/BooleanValueReaderWriter.java index 48fe1ef..f6cd074 100644 --- a/src/main/java/com/moandjiezana/toml/BooleanValueReaderWriter.java +++ b/src/main/java/dev/plex/toml/BooleanValueReaderWriter.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/com/moandjiezana/toml/Container.java b/src/main/java/dev/plex/toml/Container.java similarity index 78% rename from src/main/java/com/moandjiezana/toml/Container.java rename to src/main/java/dev/plex/toml/Container.java index 56cce75..63c8727 100644 --- a/src/main/java/com/moandjiezana/toml/Container.java +++ b/src/main/java/dev/plex/toml/Container.java @@ -1,11 +1,11 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -abstract class Container { +public abstract class Container { abstract boolean accepts(String key); abstract void put(String key, Object value); @@ -32,7 +32,7 @@ abstract class Container { @Override boolean accepts(String key) { - return !values.containsKey(key) || values.get(key) instanceof Container.TableArray; + return !values.containsKey(key) || values.get(key) instanceof TableArray; } @Override @@ -58,10 +58,10 @@ abstract class Container { */ Map consume() { for (Map.Entry entry : values.entrySet()) { - if (entry.getValue() instanceof Container.Table) { - entry.setValue(((Container.Table) entry.getValue()).consume()); - } else if (entry.getValue() instanceof Container.TableArray) { - entry.setValue(((Container.TableArray) entry.getValue()).getValues()); + if (entry.getValue() instanceof Table) { + entry.setValue(((Table) entry.getValue()).consume()); + } else if (entry.getValue() instanceof TableArray) { + entry.setValue(((TableArray) entry.getValue()).getValues()); } } @@ -75,10 +75,10 @@ abstract class Container { } static class TableArray extends Container { - private final List values = new ArrayList(); + private final List values = new ArrayList
(); TableArray() { - values.add(new Container.Table()); + values.add(new Table()); } @Override @@ -88,7 +88,7 @@ abstract class Container { @Override void put(String key, Object value) { - values.add((Container.Table) value); + values.add((Table) value); } @Override @@ -102,13 +102,13 @@ abstract class Container { List> getValues() { ArrayList> unwrappedValues = new ArrayList>(); - for (Container.Table table : values) { + for (Table table : values) { unwrappedValues.add(table.consume()); } return unwrappedValues; } - Container.Table getCurrent() { + Table getCurrent() { return values.get(values.size() - 1); } diff --git a/src/main/java/com/moandjiezana/toml/Context.java b/src/main/java/dev/plex/toml/Context.java similarity index 50% rename from src/main/java/com/moandjiezana/toml/Context.java rename to src/main/java/dev/plex/toml/Context.java index 6f6b667..c42e81c 100644 --- a/src/main/java/com/moandjiezana/toml/Context.java +++ b/src/main/java/dev/plex/toml/Context.java @@ -1,19 +1,19 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; -class Context { - final Identifier identifier; +public class Context { + final dev.plex.toml.Identifier identifier; final AtomicInteger line; final Results.Errors errors; - public Context(Identifier identifier, AtomicInteger line, Results.Errors errors) { + public Context(dev.plex.toml.Identifier identifier, AtomicInteger line, Results.Errors errors) { this.identifier = identifier; this.line = line; this.errors = errors; } - public Context with(Identifier identifier) { + public Context with(dev.plex.toml.Identifier identifier) { return new Context(identifier, line, errors); } } diff --git a/src/main/java/com/moandjiezana/toml/DatePolicy.java b/src/main/java/dev/plex/toml/DatePolicy.java similarity index 88% rename from src/main/java/com/moandjiezana/toml/DatePolicy.java rename to src/main/java/dev/plex/toml/DatePolicy.java index 518474e..4dae6ee 100644 --- a/src/main/java/com/moandjiezana/toml/DatePolicy.java +++ b/src/main/java/dev/plex/toml/DatePolicy.java @@ -1,8 +1,8 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.TimeZone; -class DatePolicy { +public class DatePolicy { private final TimeZone timeZone; private final boolean showFractionalSeconds; diff --git a/src/main/java/com/moandjiezana/toml/DateValueReaderWriter.java b/src/main/java/dev/plex/toml/DateValueReaderWriter.java similarity index 97% rename from src/main/java/com/moandjiezana/toml/DateValueReaderWriter.java rename to src/main/java/dev/plex/toml/DateValueReaderWriter.java index d6a64cf..0096a2f 100644 --- a/src/main/java/com/moandjiezana/toml/DateValueReaderWriter.java +++ b/src/main/java/dev/plex/toml/DateValueReaderWriter.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -7,7 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; -class DateValueReaderWriter implements ValueReader, ValueWriter { +public class DateValueReaderWriter implements ValueReader, ValueWriter { static final DateValueReaderWriter DATE_VALUE_READER_WRITER = new DateValueReaderWriter(); static final DateValueReaderWriter DATE_PARSER_JDK_6 = new DateConverterJdk6(); @@ -50,7 +50,7 @@ class DateValueReaderWriter implements ValueReader, ValueWriter { String s = sb.toString(); Matcher matcher = DATE_REGEX.matcher(s); - + if (!matcher.matches()) { Results.Errors errors = new Results.Errors(); errors.invalidValue(context.identifier.getName(), s, context.line.get()); diff --git a/src/main/java/dev/plex/toml/Identifier.java b/src/main/java/dev/plex/toml/Identifier.java new file mode 100644 index 0000000..db201ca --- /dev/null +++ b/src/main/java/dev/plex/toml/Identifier.java @@ -0,0 +1,331 @@ +package dev.plex.toml; + +public class Identifier +{ + + static final Identifier INVALID = new Identifier("", null); + + private static final String ALLOWED_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-"; + + private final String name; + private final Type type; + + static Identifier from(String name, Context context) + { + Type type; + boolean valid; + name = name.trim(); + if (name.startsWith("[[")) + { + type = Type.TABLE_ARRAY; + valid = isValidTableArray(name, context); + } else if (name.startsWith("[")) + { + type = Type.TABLE; + valid = isValidTable(name, context); + } else + { + type = Type.KEY; + valid = isValidKey(name, context); + } + + if (!valid) + { + return Identifier.INVALID; + } + + return new Identifier(extractName(name), type); + } + + private Identifier(String name, Type type) + { + this.name = name; + this.type = type; + } + + String getName() + { + return name; + } + + String getBareName() + { + if (isKey()) + { + return name; + } + + if (isTable()) + { + return name.substring(1, name.length() - 1); + } + + return name.substring(2, name.length() - 2); + } + + boolean isKey() + { + return type == Type.KEY; + } + + boolean isTable() + { + return type == Type.TABLE; + } + + boolean isTableArray() + { + return type == Type.TABLE_ARRAY; + } + + private static enum Type + { + KEY, TABLE, TABLE_ARRAY; + } + + private static String extractName(String raw) + { + boolean quoted = false; + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < raw.length(); i++) + { + char c = raw.charAt(i); + if (c == '"' && (i == 0 || raw.charAt(i - 1) != '\\')) + { + quoted = !quoted; + sb.append('"'); + } else if (quoted || !Character.isWhitespace(c)) + { + sb.append(c); + } + } + + return StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceUnicodeCharacters(sb.toString()); + } + + private static boolean isValidKey(String name, Context context) + { + if (name.trim().isEmpty()) + { + context.errors.invalidKey(name, context.line.get()); + return false; + } + + boolean quoted = false; + for (int i = 0; i < name.length(); i++) + { + char c = name.charAt(i); + + if (c == '"' && (i == 0 || name.charAt(i - 1) != '\\')) + { + if (!quoted && i > 0 && name.charAt(i - 1) != '.') + { + context.errors.invalidKey(name, context.line.get()); + return false; + } + quoted = !quoted; + } else if (!quoted && (ALLOWED_CHARS.indexOf(c) == -1)) + { + context.errors.invalidKey(name, context.line.get()); + return false; + } + } + + return true; + } + + private static boolean isValidTable(String name, Context context) + { + boolean valid = true; + + if (!name.endsWith("]")) + { + valid = false; + } + + String trimmed = name.substring(1, name.length() - 1).trim(); + if (trimmed.isEmpty() || trimmed.charAt(0) == '.' || trimmed.endsWith(".")) + { + valid = false; + } + + if (!valid) + { + context.errors.invalidTable(name, context.line.get()); + return false; + } + + boolean quoted = false; + boolean dotAllowed = false; + boolean quoteAllowed = true; + boolean charAllowed = true; + + for (int i = 0; i < trimmed.length(); i++) + { + char c = trimmed.charAt(i); + + if (!valid) + { + break; + } + + if (Keys.isQuote(c)) + { + if (!quoteAllowed) + { + valid = false; + } else if (quoted && trimmed.charAt(i - 1) != '\\') + { + charAllowed = false; + dotAllowed = true; + quoteAllowed = false; + } else if (!quoted) + { + quoted = true; + quoteAllowed = true; + } + } else if (quoted) + { + continue; + } else if (c == '.') + { + if (dotAllowed) + { + charAllowed = true; + dotAllowed = false; + quoteAllowed = true; + } else + { + context.errors.emptyImplicitTable(name, context.line.get()); + return false; + } + } else if (Character.isWhitespace(c)) + { + char prev = trimmed.charAt(i - 1); + if (!Character.isWhitespace(prev) && prev != '.') + { + charAllowed = false; + dotAllowed = true; + quoteAllowed = true; + } + } else + { + if (charAllowed && ALLOWED_CHARS.indexOf(c) > -1) + { + charAllowed = true; + dotAllowed = true; + quoteAllowed = false; + } else + { + valid = false; + } + } + } + + if (!valid) + { + context.errors.invalidTable(name, context.line.get()); + return false; + } + + return true; + } + + private static boolean isValidTableArray(String line, Context context) + { + boolean valid = true; + + if (!line.endsWith("]]")) + { + valid = false; + } + + String trimmed = line.substring(2, line.length() - 2).trim(); + if (trimmed.isEmpty() || trimmed.charAt(0) == '.' || trimmed.endsWith(".")) + { + valid = false; + } + + if (!valid) + { + context.errors.invalidTableArray(line, context.line.get()); + return false; + } + + boolean quoted = false; + boolean dotAllowed = false; + boolean quoteAllowed = true; + boolean charAllowed = true; + + for (int i = 0; i < trimmed.length(); i++) + { + char c = trimmed.charAt(i); + + if (!valid) + { + break; + } + + if (c == '"') + { + if (!quoteAllowed) + { + valid = false; + } else if (quoted && trimmed.charAt(i - 1) != '\\') + { + charAllowed = false; + dotAllowed = true; + quoteAllowed = false; + } else if (!quoted) + { + quoted = true; + quoteAllowed = true; + } + } else if (quoted) + { + continue; + } else if (c == '.') + { + if (dotAllowed) + { + charAllowed = true; + dotAllowed = false; + quoteAllowed = true; + } else + { + context.errors.emptyImplicitTable(line, context.line.get()); + return false; + } + } else if (Character.isWhitespace(c)) + { + char prev = trimmed.charAt(i - 1); + if (!Character.isWhitespace(prev) && prev != '.' && prev != '"') + { + charAllowed = false; + dotAllowed = true; + quoteAllowed = true; + } + } else + { + if (charAllowed && ALLOWED_CHARS.indexOf(c) > -1) + { + charAllowed = true; + dotAllowed = true; + quoteAllowed = false; + } else + { + valid = false; + } + } + } + + if (!valid) + { + context.errors.invalidTableArray(line, context.line.get()); + return false; + } + + return true; + } +} diff --git a/src/main/java/com/moandjiezana/toml/IdentifierConverter.java b/src/main/java/dev/plex/toml/IdentifierConverter.java similarity index 96% rename from src/main/java/com/moandjiezana/toml/IdentifierConverter.java rename to src/main/java/dev/plex/toml/IdentifierConverter.java index d5c246f..5eb168d 100644 --- a/src/main/java/com/moandjiezana/toml/IdentifierConverter.java +++ b/src/main/java/dev/plex/toml/IdentifierConverter.java @@ -1,8 +1,8 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; -class IdentifierConverter { +public class IdentifierConverter { static final IdentifierConverter IDENTIFIER_CONVERTER = new IdentifierConverter(); diff --git a/src/main/java/com/moandjiezana/toml/IndentationPolicy.java b/src/main/java/dev/plex/toml/IndentationPolicy.java similarity index 92% rename from src/main/java/com/moandjiezana/toml/IndentationPolicy.java rename to src/main/java/dev/plex/toml/IndentationPolicy.java index 1a88606..7a6facd 100644 --- a/src/main/java/com/moandjiezana/toml/IndentationPolicy.java +++ b/src/main/java/dev/plex/toml/IndentationPolicy.java @@ -1,11 +1,11 @@ -package com.moandjiezana.toml; +package dev.plex.toml; /** * Controls how a {@link TomlWriter} indents tables and key/value pairs. * * The default policy is to not indent. */ -class IndentationPolicy { +public class IndentationPolicy { private final int tableIndent; private final int keyValueIndent; private final int arrayDelimiterPadding; diff --git a/src/main/java/com/moandjiezana/toml/InlineTableValueReader.java b/src/main/java/dev/plex/toml/InlineTableValueReader.java similarity index 76% rename from src/main/java/com/moandjiezana/toml/InlineTableValueReader.java rename to src/main/java/dev/plex/toml/InlineTableValueReader.java index 1c8cbfe..97bb994 100644 --- a/src/main/java/com/moandjiezana/toml/InlineTableValueReader.java +++ b/src/main/java/dev/plex/toml/InlineTableValueReader.java @@ -1,11 +1,10 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.ValueReaders.VALUE_READERS; +package dev.plex.toml; import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; -class InlineTableValueReader implements ValueReader { +class InlineTableValueReader implements dev.plex.toml.ValueReader +{ static final InlineTableValueReader INLINE_TABLE_VALUE_READER = new InlineTableValueReader(); @@ -15,7 +14,7 @@ class InlineTableValueReader implements ValueReader { } @Override - public Object read(String s, AtomicInteger sharedIndex, Context context) { + public Object read(String s, AtomicInteger sharedIndex, dev.plex.toml.Context context) { AtomicInteger line = context.line; int startLine = line.get(); int startIndex = sharedIndex.get(); @@ -24,16 +23,16 @@ class InlineTableValueReader implements ValueReader { boolean terminated = false; StringBuilder currentKey = new StringBuilder(); HashMap results = new HashMap(); - Results.Errors errors = new Results.Errors(); + dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors(); for (int i = sharedIndex.incrementAndGet(); sharedIndex.get() < s.length(); i = sharedIndex.incrementAndGet()) { char c = s.charAt(i); if (inValue && !Character.isWhitespace(c)) { - Object converted = VALUE_READERS.convert(s, sharedIndex, context.with(Identifier.from(currentKey.toString(), context))); + Object converted = dev.plex.toml.ValueReaders.VALUE_READERS.convert(s, sharedIndex, context.with(dev.plex.toml.Identifier.from(currentKey.toString(), context))); - if (converted instanceof Results.Errors) { - errors.add((Results.Errors) converted); + if (converted instanceof dev.plex.toml.Results.Errors) { + errors.add((dev.plex.toml.Results.Errors) converted); return errors; } diff --git a/src/main/java/com/moandjiezana/toml/Keys.java b/src/main/java/dev/plex/toml/Keys.java similarity index 95% rename from src/main/java/com/moandjiezana/toml/Keys.java rename to src/main/java/dev/plex/toml/Keys.java index f240bed..7274dc5 100644 --- a/src/main/java/com/moandjiezana/toml/Keys.java +++ b/src/main/java/dev/plex/toml/Keys.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.ArrayList; import java.util.List; @@ -21,7 +21,7 @@ class Keys { } } - static Keys.Key[] split(String key) { + static Key[] split(String key) { List splitKey = new ArrayList(); StringBuilder current = new StringBuilder(); boolean quoted = false; diff --git a/src/main/java/dev/plex/toml/LiteralStringValueReader.java b/src/main/java/dev/plex/toml/LiteralStringValueReader.java new file mode 100644 index 0000000..f2fe990 --- /dev/null +++ b/src/main/java/dev/plex/toml/LiteralStringValueReader.java @@ -0,0 +1,47 @@ +package dev.plex.toml; + +import java.util.concurrent.atomic.AtomicInteger; + +public class LiteralStringValueReader implements ValueReader +{ + public static final LiteralStringValueReader LITERAL_STRING_VALUE_READER = new LiteralStringValueReader(); + @Override + public boolean canRead(String s) + { + return s.startsWith("'"); + } + + @Override + public Object read(String s, AtomicInteger index, dev.plex.toml.Context context) + { + int startLine = context.line.get(); + boolean terminated = false; + int startIndex = index.incrementAndGet(); + + for (int i = index.get(); i < s.length(); i = index.incrementAndGet()) + { + char c = s.charAt(i); + + if (c == '\'') + { + terminated = true; + break; + } + } + + if (!terminated) + { + Results.Errors errors = new Results.Errors(); + errors.unterminated(context.identifier.getName(), s.substring(startIndex), startLine); + return errors; + } + + String substring = s.substring(startIndex, index.get()); + + return substring; + } + + private LiteralStringValueReader() + { + } +} diff --git a/src/main/java/dev/plex/toml/MapValueWriter.java b/src/main/java/dev/plex/toml/MapValueWriter.java new file mode 100644 index 0000000..20247b1 --- /dev/null +++ b/src/main/java/dev/plex/toml/MapValueWriter.java @@ -0,0 +1,167 @@ +package dev.plex.toml; + + +import java.io.File; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +class MapValueWriter implements dev.plex.toml.ValueWriter +{ + static final dev.plex.toml.ValueWriter MAP_VALUE_WRITER = new MapValueWriter(); + + private static final Pattern REQUIRED_QUOTING_PATTERN = Pattern.compile("^.*[^A-Za-z\\d_-].*$"); + + @Override + public boolean canWrite(Object value) + { + return value instanceof Map; + } + + @Override + public void write(Object value, WriterContext context) + { + File file = null; + if (context.file != null) + { + file = context.file; + } + + Map from = (Map) value; + + Toml toml = null; + + if (file != null) + { + toml = new Toml().read(file); + } + + if (hasPrimitiveValues(from, context)) + { + if (context.hasRun) + { + if (toml != null) + { + if (!toml.getValues().containsKey(context.key)) + { + context.writeKey(); + } + } else + { + context.writeKey(); + } + } + + } + + + // Render primitive types and arrays of primitive first so they are + // grouped under the same table (if there is one) + for (Map.Entry entry : from.entrySet()) + { + Object key = entry.getKey(); + Object fromValue = entry.getValue(); + if (fromValue == null) + { + continue; + } + + if (context.hasRun && toml != null) + { + if (context.key != null) + { + if (key.toString().equalsIgnoreCase(context.key)) continue; + if (toml.contains(context.key + "." + key)) continue; + } + } + + dev.plex.toml.ValueWriter valueWriter = dev.plex.toml.ValueWriters.WRITERS.findWriterFor(fromValue); + if (valueWriter.isPrimitiveType()) + { + context.indent(); + context.write(quoteKey(key)).write(" = "); + valueWriter.write(fromValue, context); + context.write('\n'); + } else if (valueWriter == dev.plex.toml.PrimitiveArrayValueWriter.PRIMITIVE_ARRAY_VALUE_WRITER) + { + context.indent(); + context.setArrayKey(key.toString()); + context.write(quoteKey(key)).write(" = "); + valueWriter.write(fromValue, context); + context.write('\n'); + } + } + + // Now render (sub)tables and arrays of tables + for (Object key : from.keySet()) + { + Object fromValue = from.get(key); + if (fromValue == null) + { + continue; + } + + if (context.hasRun && toml != null) + { + if (context.key != null) + { + if (key.toString().equalsIgnoreCase(context.key)) continue; + if (toml.contains(context.key + "." + key)) continue; + } + } + + dev.plex.toml.ValueWriter valueWriter = dev.plex.toml.ValueWriters.WRITERS.findWriterFor(fromValue); + if (valueWriter == this || valueWriter == dev.plex.toml.ObjectValueWriter.OBJECT_VALUE_WRITER || valueWriter == dev.plex.toml.TableArrayValueWriter.TABLE_ARRAY_VALUE_WRITER) + { + WriterContext context1 = context.pushTable(quoteKey(key)); + context1.parentName = key.toString(); + context1.hasRun = true; + context1.file = context.file; + valueWriter.write(fromValue, context1); + } + } + } + + @Override + public boolean isPrimitiveType() + { + return false; + } + + private static String quoteKey(Object key) + { + String stringKey = key.toString(); + Matcher matcher = REQUIRED_QUOTING_PATTERN.matcher(stringKey); + if (matcher.matches()) + { + stringKey = "\"" + stringKey + "\""; + } + + return stringKey; + } + + private static boolean hasPrimitiveValues(Map values, WriterContext context) + { + for (Object key : values.keySet()) + { + Object fromValue = values.get(key); + if (fromValue == null) + { + continue; + } + + dev.plex.toml.ValueWriter valueWriter = dev.plex.toml.ValueWriters.WRITERS.findWriterFor(fromValue); + if (valueWriter.isPrimitiveType() || valueWriter == dev.plex.toml.PrimitiveArrayValueWriter.PRIMITIVE_ARRAY_VALUE_WRITER) + { + return true; + } + } + + return false; + } + + + private MapValueWriter() + { + } +} diff --git a/src/main/java/com/moandjiezana/toml/MultilineLiteralStringValueReader.java b/src/main/java/dev/plex/toml/MultilineLiteralStringValueReader.java similarity index 93% rename from src/main/java/com/moandjiezana/toml/MultilineLiteralStringValueReader.java rename to src/main/java/dev/plex/toml/MultilineLiteralStringValueReader.java index 6e058d6..a9fa487 100644 --- a/src/main/java/com/moandjiezana/toml/MultilineLiteralStringValueReader.java +++ b/src/main/java/dev/plex/toml/MultilineLiteralStringValueReader.java @@ -1,8 +1,9 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; -class MultilineLiteralStringValueReader implements ValueReader { +class MultilineLiteralStringValueReader implements ValueReader +{ static final MultilineLiteralStringValueReader MULTILINE_LITERAL_STRING_VALUE_READER = new MultilineLiteralStringValueReader(); diff --git a/src/main/java/com/moandjiezana/toml/MultilineStringValueReader.java b/src/main/java/dev/plex/toml/MultilineStringValueReader.java similarity index 73% rename from src/main/java/com/moandjiezana/toml/MultilineStringValueReader.java rename to src/main/java/dev/plex/toml/MultilineStringValueReader.java index 0f70e84..fc0e418 100644 --- a/src/main/java/com/moandjiezana/toml/MultilineStringValueReader.java +++ b/src/main/java/dev/plex/toml/MultilineStringValueReader.java @@ -1,8 +1,9 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; -class MultilineStringValueReader implements ValueReader { +class MultilineStringValueReader implements ValueReader +{ static final MultilineStringValueReader MULTILINE_STRING_VALUE_READER = new MultilineStringValueReader(); @@ -12,7 +13,7 @@ class MultilineStringValueReader implements ValueReader { } @Override - public Object read(String s, AtomicInteger index, Context context) { + public Object read(String s, AtomicInteger index, dev.plex.toml.Context context) { AtomicInteger line = context.line; int startLine = line.get(); int originalStartIndex = index.get(); @@ -37,15 +38,15 @@ class MultilineStringValueReader implements ValueReader { } if (endIndex == -1) { - Results.Errors errors = new Results.Errors(); + dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors(); errors.unterminated(context.identifier.getName(), s.substring(originalStartIndex), startLine); return errors; } s = s.substring(startIndex, endIndex); s = s.replaceAll("\\\\\\s+", ""); - s = StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceUnicodeCharacters(s); - s = StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceSpecialCharacters(s); + s = dev.plex.toml.StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceUnicodeCharacters(s); + s = dev.plex.toml.StringValueReaderWriter.STRING_VALUE_READER_WRITER.replaceSpecialCharacters(s); return s; } diff --git a/src/main/java/com/moandjiezana/toml/NumberValueReaderWriter.java b/src/main/java/dev/plex/toml/NumberValueReaderWriter.java similarity index 88% rename from src/main/java/com/moandjiezana/toml/NumberValueReaderWriter.java rename to src/main/java/dev/plex/toml/NumberValueReaderWriter.java index 4477ec4..f15ab65 100644 --- a/src/main/java/com/moandjiezana/toml/NumberValueReaderWriter.java +++ b/src/main/java/dev/plex/toml/NumberValueReaderWriter.java @@ -1,8 +1,9 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; -class NumberValueReaderWriter implements ValueReader, ValueWriter { +class NumberValueReaderWriter implements dev.plex.toml.ValueReader, dev.plex.toml.ValueWriter +{ static final NumberValueReaderWriter NUMBER_VALUE_READER_WRITER = new NumberValueReaderWriter(); @Override @@ -13,7 +14,7 @@ class NumberValueReaderWriter implements ValueReader, ValueWriter { } @Override - public Object read(String s, AtomicInteger index, Context context) { + public Object read(String s, AtomicInteger index, dev.plex.toml.Context context) { boolean signable = true; boolean dottable = false; boolean exponentable = false; @@ -77,7 +78,7 @@ class NumberValueReaderWriter implements ValueReader, ValueWriter { return Double.parseDouble(exponentString[0]) * Math.pow(10, Double.parseDouble(exponentString[1])); } else { - Results.Errors errors = new Results.Errors(); + dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors(); errors.invalidValue(context.identifier.getName(), sb.toString(), context.line.get()); return errors; } @@ -89,7 +90,7 @@ class NumberValueReaderWriter implements ValueReader, ValueWriter { } @Override - public void write(Object value, WriterContext context) { + public void write(Object value, dev.plex.toml.WriterContext context) { context.write(value.toString()); } diff --git a/src/main/java/dev/plex/toml/ObjectValueWriter.java b/src/main/java/dev/plex/toml/ObjectValueWriter.java new file mode 100644 index 0000000..d764487 --- /dev/null +++ b/src/main/java/dev/plex/toml/ObjectValueWriter.java @@ -0,0 +1,88 @@ +package dev.plex.toml; + +import com.google.gson.annotations.SerializedName; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.*; + +class ObjectValueWriter implements ValueWriter +{ + static final ValueWriter OBJECT_VALUE_WRITER = new ObjectValueWriter(); + + @Override + public boolean canWrite(Object value) + { + return true; + } + + @Override + public void write(Object value, WriterContext context) + { + Map to = new LinkedHashMap(); + Set fields = getFields(value.getClass()); + for (Field field : fields) + { + if (field.isAnnotationPresent(SerializedName.class)) + { + to.put(field.getDeclaredAnnotation(SerializedName.class).value(), getFieldValue(field, value)); + } else { + to.put(field.getName(), getFieldValue(field, value)); + } + } + + MapValueWriter.MAP_VALUE_WRITER.write(to, context); + } + + @Override + public boolean isPrimitiveType() + { + return false; + } + + private static Set getFields(Class cls) + { + Set fields = new LinkedHashSet(Arrays.asList(cls.getDeclaredFields())); + while (cls != Object.class) + { + fields.addAll(Arrays.asList(cls.getDeclaredFields())); + cls = cls.getSuperclass(); + } + removeConstantsAndSyntheticFields(fields); + + return fields; + } + + private static void removeConstantsAndSyntheticFields(Set fields) + { + Iterator iterator = fields.iterator(); + while (iterator.hasNext()) + { + Field field = iterator.next(); + if ((Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) || field.isSynthetic() || Modifier.isTransient(field.getModifiers())) + { + iterator.remove(); + } + } + } + + private static Object getFieldValue(Field field, Object o) + { + boolean isAccessible = field.isAccessible(); + field.setAccessible(true); + Object value = null; + try + { + value = field.get(o); + } catch (IllegalAccessException ignored) + { + } + field.setAccessible(isAccessible); + + return value; + } + + private ObjectValueWriter() + { + } +} diff --git a/src/main/java/com/moandjiezana/toml/PrimitiveArrayValueWriter.java b/src/main/java/dev/plex/toml/PrimitiveArrayValueWriter.java similarity index 77% rename from src/main/java/com/moandjiezana/toml/PrimitiveArrayValueWriter.java rename to src/main/java/dev/plex/toml/PrimitiveArrayValueWriter.java index 7c4125d..5692277 100644 --- a/src/main/java/com/moandjiezana/toml/PrimitiveArrayValueWriter.java +++ b/src/main/java/dev/plex/toml/PrimitiveArrayValueWriter.java @@ -1,10 +1,9 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.ValueWriters.WRITERS; +package dev.plex.toml; import java.util.Collection; -class PrimitiveArrayValueWriter extends ArrayValueWriter { +class PrimitiveArrayValueWriter extends ArrayValueWriter +{ static final ValueWriter PRIMITIVE_ARRAY_VALUE_WRITER = new PrimitiveArrayValueWriter(); @Override @@ -24,10 +23,10 @@ class PrimitiveArrayValueWriter extends ArrayValueWriter { for (Object value : values) { if (first) { - firstWriter = WRITERS.findWriterFor(value); + firstWriter = ValueWriters.WRITERS.findWriterFor(value); first = false; } else { - ValueWriter writer = WRITERS.findWriterFor(value); + ValueWriter writer = ValueWriters.WRITERS.findWriterFor(value); if (writer != firstWriter) { throw new IllegalStateException( context.getContextPath() + @@ -38,7 +37,7 @@ class PrimitiveArrayValueWriter extends ArrayValueWriter { context.write(", "); } - WRITERS.findWriterFor(value).write(value, context); + ValueWriters.WRITERS.findWriterFor(value).write(value, context); } context.writeArrayDelimiterPadding(); diff --git a/src/main/java/com/moandjiezana/toml/Results.java b/src/main/java/dev/plex/toml/Results.java similarity index 92% rename from src/main/java/com/moandjiezana/toml/Results.java rename to src/main/java/dev/plex/toml/Results.java index b5d7ba1..476a91b 100644 --- a/src/main/java/com/moandjiezana/toml/Results.java +++ b/src/main/java/dev/plex/toml/Results.java @@ -1,11 +1,6 @@ -package com.moandjiezana.toml; +package dev.plex.toml; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; class Results { @@ -60,7 +55,7 @@ class Results { .append(key); } - void invalidTextAfterIdentifier(Identifier identifier, char text, int line) { + void invalidTextAfterIdentifier(dev.plex.toml.Identifier identifier, char text, int line) { sb.append("Invalid text after key ") .append(identifier.getName()) .append(" on line ") @@ -143,9 +138,9 @@ class Results { if (path == null) { startTable(key, line); } else if (path.isEmpty()) { - startTables(Identifier.from(key, null), line); + startTables(dev.plex.toml.Identifier.from(key, null), line); } else { - startTables(Identifier.from(path, null), line); + startTables(dev.plex.toml.Identifier.from(path, null), line); } @SuppressWarnings("unchecked") Map valueMap = (Map) value; @@ -164,13 +159,13 @@ class Results { } } - void startTableArray(Identifier identifier, AtomicInteger line) { + void startTableArray(dev.plex.toml.Identifier identifier, AtomicInteger line) { String tableName = identifier.getBareName(); while (stack.size() > 1) { stack.pop(); } - Keys.Key[] tableParts = Keys.split(tableName); + dev.plex.toml.Keys.Key[] tableParts = dev.plex.toml.Keys.split(tableName); for (int i = 0; i < tableParts.length; i++) { String tablePart = tableParts[i].name; Container currentContainer = stack.peek(); @@ -203,14 +198,14 @@ class Results { } } - void startTables(Identifier id, AtomicInteger line) { + void startTables(dev.plex.toml.Identifier id, AtomicInteger line) { String tableName = id.getBareName(); while (stack.size() > 1) { stack.pop(); } - Keys.Key[] tableParts = Keys.split(tableName); + dev.plex.toml.Keys.Key[] tableParts = dev.plex.toml.Keys.split(tableName); for (int i = 0; i < tableParts.length; i++) { String tablePart = tableParts[i].name; Container currentContainer = stack.peek(); diff --git a/src/main/java/com/moandjiezana/toml/StringValueReaderWriter.java b/src/main/java/dev/plex/toml/StringValueReaderWriter.java similarity index 99% rename from src/main/java/com/moandjiezana/toml/StringValueReaderWriter.java rename to src/main/java/dev/plex/toml/StringValueReaderWriter.java index cce4e1c..ae59ef4 100644 --- a/src/main/java/com/moandjiezana/toml/StringValueReaderWriter.java +++ b/src/main/java/dev/plex/toml/StringValueReaderWriter.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.net.URI; import java.net.URL; @@ -6,7 +6,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; -class StringValueReaderWriter implements ValueReader, ValueWriter { +class StringValueReaderWriter implements ValueReader, ValueWriter +{ static final StringValueReaderWriter STRING_VALUE_READER_WRITER = new StringValueReaderWriter(); private static final Pattern UNICODE_REGEX = Pattern.compile("\\\\[uU](.{4})"); diff --git a/src/main/java/com/moandjiezana/toml/TableArrayValueWriter.java b/src/main/java/dev/plex/toml/TableArrayValueWriter.java similarity index 81% rename from src/main/java/com/moandjiezana/toml/TableArrayValueWriter.java rename to src/main/java/dev/plex/toml/TableArrayValueWriter.java index e2f2fb8..f4cc9ce 100644 --- a/src/main/java/com/moandjiezana/toml/TableArrayValueWriter.java +++ b/src/main/java/dev/plex/toml/TableArrayValueWriter.java @@ -1,10 +1,11 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.ValueWriters.WRITERS; +package dev.plex.toml; import java.util.Collection; -class TableArrayValueWriter extends ArrayValueWriter { +import static dev.plex.toml.ValueWriters.WRITERS; + +class TableArrayValueWriter extends ArrayValueWriter +{ static final ValueWriter TABLE_ARRAY_VALUE_WRITER = new TableArrayValueWriter(); @Override diff --git a/src/main/java/dev/plex/toml/Toml.java b/src/main/java/dev/plex/toml/Toml.java new file mode 100644 index 0000000..b90c161 --- /dev/null +++ b/src/main/java/dev/plex/toml/Toml.java @@ -0,0 +1,481 @@ +package dev.plex.toml; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import lombok.Getter; + +import java.io.*; +import java.util.*; + +/** + *

Provides access to the keys and tables in a TOML data source.

+ * + *

All getters can fall back to default values if they have been provided as a constructor argument. + * Getters for simple values (String, Date, etc.) will return null if no matching key exists. + * {@link #getList(String)}, {@link #getTable(String)} and {@link #getTables(String)} return empty values if there is no matching key.

+ * + *

All read methods throw an {@link IllegalStateException} if the TOML is incorrect.

+ * + *

Example usage:

+ *

+ * Toml toml = new Toml().read(getTomlFile());
+ * String name = toml.getString("name");
+ * Long port = toml.getLong("server.ip"); // compound key. Is equivalent to:
+ * Long port2 = toml.getTable("server").getLong("ip");
+ * MyConfig config = toml.to(MyConfig.class);
+ * 
+ */ +public class Toml +{ + + private static final Gson DEFAULT_GSON = new Gson(); + + @Getter + private Map values = new HashMap(); + private final Toml defaults; + + /** + * Creates Toml instance with no defaults. + */ + public Toml() + { + this(null); + } + + /** + * @param defaults fallback values used when the requested key or table is not present in the TOML source that has been read. + */ + public Toml(Toml defaults) + { + this(defaults, new HashMap<>()); + } + + /** + * Populates the current Toml instance with values from file. + * + * @param file The File to be read. Expected to be encoded as UTF-8. + * @return this instance + * @throws IllegalStateException If file contains invalid TOML + */ + public Toml read(File file) + { + try + { + return read(new InputStreamReader(new FileInputStream(file), "UTF8")); + } catch (Exception e) + { + throw new RuntimeException(e); + } + } + + /** + * Populates the current Toml instance with values from inputStream. + * + * @param inputStream Closed after it has been read. + * @return this instance + * @throws IllegalStateException If file contains invalid TOML + */ + public Toml read(InputStream inputStream) + { + return read(new InputStreamReader(inputStream)); + } + + /** + * Populates the current Toml instance with values from reader. + * + * @param reader Closed after it has been read. + * @return this instance + * @throws IllegalStateException If file contains invalid TOML + */ + public Toml read(Reader reader) + { + BufferedReader bufferedReader = null; + try + { + bufferedReader = new BufferedReader(reader); + + StringBuilder w = new StringBuilder(); + String line = bufferedReader.readLine(); + while (line != null) + { + w.append(line).append('\n'); + line = bufferedReader.readLine(); + } + read(w.toString()); + } catch (IOException e) + { + throw new RuntimeException(e); + } finally + { + try + { + bufferedReader.close(); + } catch (IOException e) + { + } + } + return this; + } + + /** + * Populates the current Toml instance with values from otherToml. + * + * @param otherToml + * @return this instance + */ + public Toml read(Toml otherToml) + { + this.values = otherToml.values; + + return this; + } + + /** + * Populates the current Toml instance with values from tomlString. + * + * @param tomlString String to be read. + * @return this instance + * @throws IllegalStateException If tomlString is not valid TOML + */ + public Toml read(String tomlString) throws IllegalStateException + { + dev.plex.toml.Results results = dev.plex.toml.TomlParser.run(tomlString); + if (results.errors.hasErrors()) + { + throw new IllegalStateException(results.errors.toString()); + } + + this.values = results.consume(); + + return this; + } + + public String getString(String key) + { + return (String) get(key); + } + + public String getString(String key, String defaultValue) + { + String val = getString(key); + return val == null ? defaultValue : val; + } + + public Long getLong(String key) + { + return (Long) get(key); + } + + public Long getLong(String key, Long defaultValue) + { + Long val = getLong(key); + return val == null ? defaultValue : val; + } + + /** + * @param key a TOML key + * @param type of list items + * @return null if the key is not found + */ + public List getList(String key) + { + @SuppressWarnings("unchecked") + List list = (List) get(key); + + return list; + } + + /** + * @param key a TOML key + * @param defaultValue a list of default values + * @param type of list items + * @return null is the key is not found + */ + public List getList(String key, List defaultValue) + { + List list = getList(key); + + return list != null ? list : defaultValue; + } + + public Boolean getBoolean(String key) + { + return (Boolean) get(key); + } + + public Boolean getBoolean(String key, Boolean defaultValue) + { + Boolean val = getBoolean(key); + return val == null ? defaultValue : val; + } + + public Date getDate(String key) + { + return (Date) get(key); + } + + public Date getDate(String key, Date defaultValue) + { + Date val = getDate(key); + return val == null ? defaultValue : val; + } + + public Double getDouble(String key) + { + return (Double) get(key); + } + + public Double getDouble(String key, Double defaultValue) + { + Double val = getDouble(key); + return val == null ? defaultValue : val; + } + + /** + * @param key A table name, not including square brackets. + * @return A new Toml instance or null if no value is found for key. + */ + @SuppressWarnings("unchecked") + public Toml getTable(String key) + { + Map map = (Map) get(key); + + return map != null ? new Toml(null, map) : null; + } + + /** + * @param key Name of array of tables, not including square brackets. + * @return A {@link List} of Toml instances or null if no value is found for key. + */ + @SuppressWarnings("unchecked") + public List getTables(String key) + { + List> tableArray = (List>) get(key); + + if (tableArray == null) + { + return null; + } + + ArrayList tables = new ArrayList(); + + for (Map table : tableArray) + { + tables.add(new Toml(null, table)); + } + + return tables; + } + + /** + * @param key a key name, can be compound (eg. a.b.c) + * @return true if key is present + */ + public boolean contains(String key) + { + return get(key) != null; + } + + /** + * @param key a key name, can be compound (eg. a.b.c) + * @return true if key is present and is a primitive + */ + public boolean containsPrimitive(String key) + { + Object object = get(key); + + return object != null && !(object instanceof Map) && !(object instanceof List); + } + + /** + * @param key a key name, can be compound (eg. a.b.c) + * @return true if key is present and is a table + */ + public boolean containsTable(String key) + { + Object object = get(key); + + return object != null && (object instanceof Map); + } + + /** + * @param key a key name, can be compound (eg. a.b.c) + * @return true if key is present and is a table array + */ + public boolean containsTableArray(String key) + { + Object object = get(key); + + return object != null && (object instanceof List); + } + + public boolean isEmpty() + { + return values.isEmpty(); + } + + /** + *

+ * Populates an instance of targetClass with the values of this Toml instance. + * The target's field names must match keys or tables. + * Keys not present in targetClass will be ignored. + *

+ * + *

Tables are recursively converted to custom classes or to {@link Map Map<String, Object>}.

+ * + *

In addition to straight-forward conversion of TOML primitives, the following are also available:

+ * + *
    + *
  • Integer -> int, long (or wrapper), {@link java.math.BigInteger}
  • + *
  • Float -> float, double (or wrapper), {@link java.math.BigDecimal}
  • + *
  • One-letter String -> char, {@link Character}
  • + *
  • String -> {@link String}, enum, {@link java.net.URI}, {@link java.net.URL}
  • + *
  • Multiline and Literal Strings -> {@link String}
  • + *
  • Array -> {@link List}, {@link Set}, array. The generic type can be anything that can be converted.
  • + *
  • Table -> Custom class, {@link Map Map<String, Object>}
  • + *
+ * + * @param targetClass Class to deserialize TOML to. + * @param type of targetClass. + * @return A new instance of targetClass. + */ + public T to(Class targetClass) + { + JsonElement json = DEFAULT_GSON.toJsonTree(toMap()); + + if (targetClass == JsonElement.class) + { + return targetClass.cast(json); + } + + return DEFAULT_GSON.fromJson(json, targetClass); + } + + public Map toMap() + { + HashMap valuesCopy = new HashMap(values); + + if (defaults != null) + { + for (Map.Entry entry : defaults.values.entrySet()) + { + if (!valuesCopy.containsKey(entry.getKey())) + { + valuesCopy.put(entry.getKey(), entry.getValue()); + } + } + } + + return valuesCopy; + } + + /** + * @return a {@link Set} of Map.Entry instances. Modifications to the {@link Set} are not reflected in this Toml instance. Entries are immutable, so {@link Map.Entry#setValue(Object)} throws an UnsupportedOperationException. + */ + public Set> entrySet() + { + Set> entries = new LinkedHashSet>(); + + for (Map.Entry entry : values.entrySet()) + { + Class entryClass = entry.getValue().getClass(); + + if (Map.class.isAssignableFrom(entryClass)) + { + entries.add(new Entry(entry.getKey(), getTable(entry.getKey()))); + } else if (List.class.isAssignableFrom(entryClass)) + { + List value = (List) entry.getValue(); + if (!value.isEmpty() && value.get(0) instanceof Map) + { + entries.add(new Entry(entry.getKey(), getTables(entry.getKey()))); + } else + { + entries.add(new Entry(entry.getKey(), value)); + } + } else + { + entries.add(new Entry(entry.getKey(), entry.getValue())); + } + } + + return entries; + } + + private class Entry implements Map.Entry + { + + private final String key; + private final Object value; + + @Override + public String getKey() + { + return key; + } + + @Override + public Object getValue() + { + return value; + } + + @Override + public Object setValue(Object value) + { + throw new UnsupportedOperationException("TOML entry values cannot be changed."); + } + + private Entry(String key, Object value) + { + this.key = key; + this.value = value; + } + } + + @SuppressWarnings("unchecked") + public Object get(String key) + { + if (values.containsKey(key)) + { + return values.get(key); + } + + Object current = new HashMap<>(values); + + dev.plex.toml.Keys.Key[] keys = dev.plex.toml.Keys.split(key); + + for (dev.plex.toml.Keys.Key k : keys) + { + if (k.index == -1 && current instanceof Map && ((Map) current).containsKey(k.path)) + { + return ((Map) current).get(k.path); + } + + current = ((Map) current).get(k.name); + + if (k.index > -1 && current != null) + { + if (k.index >= ((List) current).size()) + { + return null; + } + + current = ((List) current).get(k.index); + } + + if (current == null) + { + return defaults != null ? defaults.get(key) : null; + } + } + + return current; + } + + private Toml(Toml defaults, Map values) + { + this.values = values; + this.defaults = defaults; + } +} diff --git a/src/main/java/com/moandjiezana/toml/TomlParser.java b/src/main/java/dev/plex/toml/TomlParser.java similarity index 71% rename from src/main/java/com/moandjiezana/toml/TomlParser.java rename to src/main/java/dev/plex/toml/TomlParser.java index 8142ee8..a14dc14 100644 --- a/src/main/java/com/moandjiezana/toml/TomlParser.java +++ b/src/main/java/dev/plex/toml/TomlParser.java @@ -1,13 +1,11 @@ -package com.moandjiezana.toml; - -import static com.moandjiezana.toml.IdentifierConverter.IDENTIFIER_CONVERTER; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; class TomlParser { - static Results run(String tomlString) { - final Results results = new Results(); + static dev.plex.toml.Results run(String tomlString) { + final dev.plex.toml.Results results = new dev.plex.toml.Results(); if (tomlString.isEmpty()) { return results; @@ -16,7 +14,7 @@ class TomlParser { AtomicInteger index = new AtomicInteger(); boolean inComment = false; AtomicInteger line = new AtomicInteger(1); - Identifier identifier = null; + dev.plex.toml.Identifier identifier = null; Object value = null; for (int i = index.get(); i < tomlString.length(); i = index.incrementAndGet()) { @@ -29,9 +27,9 @@ class TomlParser { if (c == '#' && !inComment) { inComment = true; } else if (!Character.isWhitespace(c) && !inComment && identifier == null) { - Identifier id = IDENTIFIER_CONVERTER.convert(tomlString, index, new Context(null, line, results.errors)); + dev.plex.toml.Identifier id = dev.plex.toml.IdentifierConverter.IDENTIFIER_CONVERTER.convert(tomlString, index, new dev.plex.toml.Context(null, line, results.errors)); - if (id != Identifier.INVALID) { + if (id != dev.plex.toml.Identifier.INVALID) { if (id.isKey()) { identifier = id; } else if (id.isTable()) { @@ -46,10 +44,10 @@ class TomlParser { value = null; line.incrementAndGet(); } else if (!inComment && identifier != null && identifier.isKey() && value == null && !Character.isWhitespace(c)) { - value = ValueReaders.VALUE_READERS.convert(tomlString, index, new Context(identifier, line, results.errors)); + value = ValueReaders.VALUE_READERS.convert(tomlString, index, new dev.plex.toml.Context(identifier, line, results.errors)); - if (value instanceof Results.Errors) { - results.errors.add((Results.Errors) value); + if (value instanceof dev.plex.toml.Results.Errors) { + results.errors.add((dev.plex.toml.Results.Errors) value); } else { results.addValue(identifier.getName(), value, line); } diff --git a/src/main/java/dev/plex/toml/TomlWriter.java b/src/main/java/dev/plex/toml/TomlWriter.java new file mode 100644 index 0000000..df9848e --- /dev/null +++ b/src/main/java/dev/plex/toml/TomlWriter.java @@ -0,0 +1,178 @@ +package dev.plex.toml; + +import org.jetbrains.annotations.Nullable; + +import java.io.*; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +import static dev.plex.toml.ValueWriters.WRITERS; + +/** + *

Converts Objects to TOML

+ * + *

An input Object can comprise arbitrarily nested combinations of Java primitive types, + * other {@link Object}s, {@link Map}s, {@link List}s, and Arrays. {@link Object}s and {@link Map}s + * are output to TOML tables, and {@link List}s and Array to TOML arrays.

+ * + *

Example usage:

+ *

+ * class AClass {
+ *   int anInt = 1;
+ *   int[] anArray = { 2, 3 };
+ * }
+ *
+ * String tomlString = new TomlWriter().write(new AClass());
+ * 
+ */ +public class TomlWriter +{ + + public static class Builder + { + private int keyIndentation; + private int tableIndentation; + private int arrayDelimiterPadding = 0; + private TimeZone timeZone = TimeZone.getTimeZone("UTC"); + private boolean showFractionalSeconds = false; + + public Builder indentValuesBy(int spaces) + { + this.keyIndentation = spaces; + + return this; + } + + public Builder indentTablesBy(int spaces) + { + this.tableIndentation = spaces; + + return this; + } + + public Builder timeZone(TimeZone timeZone) + { + this.timeZone = timeZone; + + return this; + } + + /** + * @param spaces number of spaces to put between opening square bracket and first item and between closing square bracket and last item + * @return this TomlWriter.Builder instance + */ + public Builder padArrayDelimitersBy(int spaces) + { + this.arrayDelimiterPadding = spaces; + + return this; + } + + public TomlWriter build() + { + return new TomlWriter(keyIndentation, tableIndentation, arrayDelimiterPadding, timeZone, showFractionalSeconds); + } + + public Builder showFractionalSeconds() + { + this.showFractionalSeconds = true; + return this; + } + } + + private final IndentationPolicy indentationPolicy; + private final dev.plex.toml.DatePolicy datePolicy; + + /** + * Creates a TomlWriter instance. + */ + public TomlWriter() + { + this(0, 0, 0, TimeZone.getTimeZone("UTC"), false); + } + + private TomlWriter(int keyIndentation, int tableIndentation, int arrayDelimiterPadding, TimeZone timeZone, boolean showFractionalSeconds) + { + this.indentationPolicy = new IndentationPolicy(keyIndentation, tableIndentation, arrayDelimiterPadding); + this.datePolicy = new dev.plex.toml.DatePolicy(timeZone, showFractionalSeconds); + } + + /** + * Write an Object into TOML String. + * + * @param from the object to be written + * @return a string containing the TOML representation of the given Object + */ + public String write(Object from) + { + try + { + StringWriter output = new StringWriter(); + write(from, output, null); + + return output.toString(); + } catch (IOException e) + { + throw new RuntimeException(e); + } + } + + /** + * Write an Object in TOML to a {@link File}. Output is encoded as UTF-8. + * + * @param from the object to be written + * @param target the File to which the TOML will be written + * @throws IOException if any file operations fail + */ + public void write(Object from, File target) throws IOException + { + OutputStream outputStream = new FileOutputStream(target, true); + try + { + write(from, outputStream, target); + } finally + { + outputStream.close(); + } + } + + /** + * Write an Object in TOML to a {@link OutputStream}. Output is encoded as UTF-8. + * + * @param from the object to be written + * @param target the OutputStream to which the TOML will be written. The stream is NOT closed after being written to. + * @throws IOException if target.write() fails + */ + public void write(Object from, OutputStream target, @Nullable File file) throws IOException + { + OutputStreamWriter writer = new OutputStreamWriter(target, "UTF-8"); + write(from, writer, file); + writer.flush(); + } + + /** + * Write an Object in TOML to a {@link Writer}. You MUST ensure that the {@link Writer}s's encoding is set to UTF-8 for the TOML to be valid. + * + * @param from the object to be written. Can be a Map or a custom type. Must not be null. + * @param target the Writer to which TOML will be written. The Writer is not closed. + * @throws IOException if target.write() fails + * @throws IllegalArgumentException if from is of an invalid type + */ + public void write(Object from, Writer target, @Nullable File file) throws IOException + { + dev.plex.toml.ValueWriter valueWriter = WRITERS.findWriterFor(from); + if (valueWriter == MapValueWriter.MAP_VALUE_WRITER || valueWriter == dev.plex.toml.ObjectValueWriter.OBJECT_VALUE_WRITER) + { + WriterContext context = new WriterContext(indentationPolicy, datePolicy, target); + if (file != null && file.exists()) + { + context.file = file; + } + valueWriter.write(from, context); + } else + { + throw new IllegalArgumentException("An object of class " + from.getClass().getSimpleName() + " cannot produce valid TOML. Please pass in a Map or a custom type."); + } + } +} diff --git a/src/main/java/com/moandjiezana/toml/ValueReader.java b/src/main/java/dev/plex/toml/ValueReader.java similarity index 72% rename from src/main/java/com/moandjiezana/toml/ValueReader.java rename to src/main/java/dev/plex/toml/ValueReader.java index c7207c8..d983fb7 100644 --- a/src/main/java/com/moandjiezana/toml/ValueReader.java +++ b/src/main/java/dev/plex/toml/ValueReader.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; import java.util.concurrent.atomic.AtomicInteger; @@ -15,7 +15,7 @@ interface ValueReader { * @param s must already have been validated by {@link #canRead(String)} * @param index where to start in s * @param line current line number, used for error reporting - * @return a value or a {@link Results.Errors} + * @return a value or a {@link dev.plex.toml.Results.Errors} */ - Object read(String s, AtomicInteger index, Context context); + Object read(String s, AtomicInteger index, dev.plex.toml.Context context); } diff --git a/src/main/java/dev/plex/toml/ValueReaders.java b/src/main/java/dev/plex/toml/ValueReaders.java new file mode 100644 index 0000000..aa1b4d3 --- /dev/null +++ b/src/main/java/dev/plex/toml/ValueReaders.java @@ -0,0 +1,35 @@ +package dev.plex.toml; + +import java.util.concurrent.atomic.AtomicInteger; + +import static dev.plex.toml.ArrayValueReader.ARRAY_VALUE_READER; +import static dev.plex.toml.BooleanValueReaderWriter.BOOLEAN_VALUE_READER_WRITER; +import static dev.plex.toml.DateValueReaderWriter.DATE_VALUE_READER_WRITER; +import static dev.plex.toml.LiteralStringValueReader.LITERAL_STRING_VALUE_READER; +import static dev.plex.toml.MultilineLiteralStringValueReader.MULTILINE_LITERAL_STRING_VALUE_READER; +import static dev.plex.toml.MultilineStringValueReader.MULTILINE_STRING_VALUE_READER; +import static dev.plex.toml.StringValueReaderWriter.STRING_VALUE_READER_WRITER; + +class ValueReaders { + + static final ValueReaders VALUE_READERS = new ValueReaders(); + + Object convert(String value, AtomicInteger index, dev.plex.toml.Context context) { + String substring = value.substring(index.get()); + for (dev.plex.toml.ValueReader valueParser : READERS) { + if (valueParser.canRead(substring)) { + return valueParser.read(value, index, context); + } + } + + dev.plex.toml.Results.Errors errors = new dev.plex.toml.Results.Errors(); + errors.invalidValue(context.identifier.getName(), substring, context.line.get()); + return errors; + } + + private ValueReaders() {} + + private static final dev.plex.toml.ValueReader[] READERS = { + MULTILINE_STRING_VALUE_READER, MULTILINE_LITERAL_STRING_VALUE_READER, LITERAL_STRING_VALUE_READER, STRING_VALUE_READER_WRITER, DATE_VALUE_READER_WRITER, NumberValueReaderWriter.NUMBER_VALUE_READER_WRITER, BOOLEAN_VALUE_READER_WRITER, ARRAY_VALUE_READER, InlineTableValueReader.INLINE_TABLE_VALUE_READER + }; +} diff --git a/src/main/java/com/moandjiezana/toml/ValueWriter.java b/src/main/java/dev/plex/toml/ValueWriter.java similarity index 82% rename from src/main/java/com/moandjiezana/toml/ValueWriter.java rename to src/main/java/dev/plex/toml/ValueWriter.java index 20ad0b1..958f17d 100644 --- a/src/main/java/com/moandjiezana/toml/ValueWriter.java +++ b/src/main/java/dev/plex/toml/ValueWriter.java @@ -1,4 +1,4 @@ -package com.moandjiezana.toml; +package dev.plex.toml; interface ValueWriter { boolean canWrite(Object value); diff --git a/src/main/java/dev/plex/toml/ValueWriters.java b/src/main/java/dev/plex/toml/ValueWriters.java new file mode 100644 index 0000000..96e5971 --- /dev/null +++ b/src/main/java/dev/plex/toml/ValueWriters.java @@ -0,0 +1,28 @@ +package dev.plex.toml; + +class ValueWriters { + + static final ValueWriters WRITERS = new ValueWriters(); + + ValueWriter findWriterFor(Object value) { + for (ValueWriter valueWriter : VALUE_WRITERS) { + if (valueWriter.canWrite(value)) { + return valueWriter; + } + } + + return ObjectValueWriter.OBJECT_VALUE_WRITER; + } + + private ValueWriters() {} + + private static dev.plex.toml.DateValueReaderWriter getPlatformSpecificDateConverter() { + String specificationVersion = Runtime.class.getPackage().getSpecificationVersion(); + return specificationVersion != null && specificationVersion.startsWith("1.6") ? dev.plex.toml.DateValueReaderWriter.DATE_PARSER_JDK_6 : dev.plex.toml.DateValueReaderWriter.DATE_VALUE_READER_WRITER; + } + + private static final ValueWriter[] VALUE_WRITERS = { + StringValueReaderWriter.STRING_VALUE_READER_WRITER, NumberValueReaderWriter.NUMBER_VALUE_READER_WRITER, dev.plex.toml.BooleanValueReaderWriter.BOOLEAN_VALUE_READER_WRITER, getPlatformSpecificDateConverter(), + MapValueWriter.MAP_VALUE_WRITER, dev.plex.toml.PrimitiveArrayValueWriter.PRIMITIVE_ARRAY_VALUE_WRITER, TableArrayValueWriter.TABLE_ARRAY_VALUE_WRITER + }; +} diff --git a/src/main/java/dev/plex/toml/WriterContext.java b/src/main/java/dev/plex/toml/WriterContext.java new file mode 100644 index 0000000..f3c8eec --- /dev/null +++ b/src/main/java/dev/plex/toml/WriterContext.java @@ -0,0 +1,182 @@ +package dev.plex.toml; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.Arrays; + +class WriterContext +{ + private String arrayKey = null; + private boolean isArrayOfTable = false; + private boolean empty = true; + public final String key; + private final String currentTableIndent; + private final String currentFieldIndent; + private final Writer output; + private final dev.plex.toml.IndentationPolicy indentationPolicy; + private final dev.plex.toml.DatePolicy datePolicy; + + public File file; + public String parentName; + public boolean hasRun = false; + + WriterContext(dev.plex.toml.IndentationPolicy indentationPolicy, dev.plex.toml.DatePolicy datePolicy, Writer output) + { + this("", "", output, indentationPolicy, datePolicy); + } + + WriterContext pushTable(String newKey) + { + String newIndent = ""; + if (!key.isEmpty()) + { + newIndent = growIndent(indentationPolicy); + } + + String fullKey = key.isEmpty() ? newKey : key + "." + newKey; + + WriterContext subContext = new WriterContext(fullKey, newIndent, output, indentationPolicy, datePolicy); + if (!empty) + { + subContext.empty = false; + } + + return subContext; + } + + WriterContext pushTableFromArray() + { + WriterContext subContext = new WriterContext(key, currentTableIndent, output, indentationPolicy, datePolicy); + if (!empty) + { + subContext.empty = false; + } + subContext.setIsArrayOfTable(true); + + return subContext; + } + + WriterContext write(String s) + { + try + { + output.write(s); + if (empty && !s.isEmpty()) + { + empty = false; + } + + return this; + } catch (IOException e) + { + throw new RuntimeException(e); + } + } + + void write(char[] chars) + { + for (char c : chars) + { + write(c); + } + } + + WriterContext write(char c) + { + try + { + output.write(c); + empty = false; + + return this; + } catch (IOException e) + { + throw new RuntimeException(e); + } + } + + void writeKey() + { + if (key.isEmpty()) + { + return; + } + + if (!empty) + { + write('\n'); + } + + write(currentTableIndent); + + if (isArrayOfTable) + { + write("[[").write(key).write("]]\n"); + } else + { + write('[').write(key).write("]\n"); + } + } + + void writeArrayDelimiterPadding() + { + for (int i = 0; i < indentationPolicy.getArrayDelimiterPadding(); i++) + { + write(' '); + } + } + + void indent() + { + if (!key.isEmpty()) + { + write(currentFieldIndent); + } + } + + dev.plex.toml.DatePolicy getDatePolicy() + { + return datePolicy; + } + + WriterContext setIsArrayOfTable(boolean isArrayOfTable) + { + this.isArrayOfTable = isArrayOfTable; + return this; + } + + WriterContext setArrayKey(String arrayKey) + { + this.arrayKey = arrayKey; + return this; + } + + String getContextPath() + { + return key.isEmpty() ? arrayKey : key + "." + arrayKey; + } + + private String growIndent(dev.plex.toml.IndentationPolicy indentationPolicy) + { + return currentTableIndent + fillStringWithSpaces(indentationPolicy.getTableIndent()); + } + + private String fillStringWithSpaces(int count) + { + char[] chars = new char[count]; + Arrays.fill(chars, ' '); + + return new String(chars); + } + + private WriterContext(String key, String tableIndent, Writer output, dev.plex.toml.IndentationPolicy indentationPolicy, dev.plex.toml.DatePolicy datePolicy) + { + this.key = key; + this.output = output; + this.indentationPolicy = indentationPolicy; + this.currentTableIndent = tableIndent; + this.datePolicy = datePolicy; + this.currentFieldIndent = tableIndent + fillStringWithSpaces(this.indentationPolicy.getKeyValueIndent()); + } +} diff --git a/src/test/java/com/moandjiezana/toml/ArrayTest.java b/src/test/java/com/moandjiezana/toml/ArrayTest.java deleted file mode 100644 index b92e72c..0000000 --- a/src/test/java/com/moandjiezana/toml/ArrayTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.moandjiezana.toml; - -import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -import java.io.File; -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; - -import com.moandjiezana.toml.testutils.Utils; - -public class ArrayTest { - - @Test - public void should_get_array() throws Exception { - Toml toml = new Toml().read("list = [\"a\", \"b\", \"c\"]"); - - assertEquals(asList("a", "b", "c"), toml.getList("list")); - } - - @Test - public void should_return_null_if_no_value_for_key() throws Exception { - Toml toml = new Toml().read(""); - - assertNull(toml.getList("a")); - } - - @Test - public void should_allow_multiline_array() throws Exception { - Toml toml = new Toml().read(file("should_allow_multiline_array")); - - assertEquals(asList("a", "b", "c"), toml.getList("a")); - } - - @Test - @SuppressWarnings("unchecked") - public void should_get_nested_arrays() throws Exception { - Toml clients = new Toml().read("data = [ [\"gamma\", \"delta\"], [1, 2]] # just an update to make sure parsers support it"); - - assertEquals(asList(asList("gamma", "delta"), asList(1L, 2L)), clients.getList("data")); - } - - @Test - public void should_get_deeply_nested_arrays() throws Exception { - List> data = new Toml().read("data = [[[1], [2]], [3, 4]]").getList("data"); - - assertThat(data, hasSize(2)); - assertEquals(Arrays.asList(1L), data.get(0).get(0)); - assertEquals(asList(2L), data.get(0).get(1)); - assertEquals(asList(3L, 4L), data.get(1)); - } - - @Test - @SuppressWarnings("unchecked") - public void should_get_nested_arrays_with_no_space_between_outer_and_inner_array() throws Exception { - Toml clients = new Toml().read("data = [[\"gamma\", \"delta\"], [1, 2]] # just an update to make sure parsers support it"); - - assertEquals(asList(asList("gamma", "delta"), asList(1L, 2L)), clients.getList("data")); - } - - @Test - public void should_ignore_comma_at_end_of_array() throws Exception { - Toml toml = new Toml().read("key=[1,2,3,]"); - - assertEquals(asList(1L, 2L, 3L), toml.getList("key")); - } - - @Test - public void should_support_mixed_string_types() throws Exception { - Toml toml = new Toml().read("key = [\"a\", 'b', \"\"\"c\"\"\", '''d''']"); - - assertThat(toml.getList("key"), contains("a", "b", "c", "d")); - } - - @Test - public void should_support_array_terminator_in_strings() throws Exception { - Toml toml = new Toml().read("key = [\"a]\", 'b]', \"\"\"c]\"\"\", '''d]''']"); - - assertThat(toml.getList("key"), contains("a]", "b]", "c]", "d]")); - } - - @Test - public void should_support_array_of_inline_tables() throws Exception { - Toml toml = new Toml().read(getClass().getResourceAsStream("should_support_array_of_inline_tables.toml")); - - assertThat(toml.getList("points"), hasSize(4)); - assertEquals(1, toml.getLong("points[0].x").longValue()); - assertEquals(2, toml.getLong("points[0].y").longValue()); - assertEquals(3, toml.getLong("points[0].z").longValue()); - assertEquals(7, toml.getLong("points[1].x").longValue()); - assertEquals(8, toml.getLong("points[1].y").longValue()); - assertEquals(9, toml.getLong("points[1].z").longValue()); - assertEquals(2, toml.getLong("points[2].x").longValue()); - assertEquals(4, toml.getLong("points[2].y").longValue()); - assertEquals(8, toml.getLong("points[2].z").longValue()); - assertEquals("3", toml.getString("points[3].x")); - assertEquals("6", toml.getString("points[3].y")); - assertEquals("12", toml.getString("points[3].z")); - } - - private File file(String file) { - return Utils.file(getClass(), file); - } -} diff --git a/src/test/java/com/moandjiezana/toml/BareKeysTest.java b/src/test/java/com/moandjiezana/toml/BareKeysTest.java deleted file mode 100644 index 5a8594e..0000000 --- a/src/test/java/com/moandjiezana/toml/BareKeysTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class BareKeysTest { - - @Test - public void should_ignore_spaces_around_key_segments() throws Exception { - Toml toml = new Toml().read("[ a . b . c ] \n key = \"a\""); - - assertEquals("a", toml.getString("a.b.c.key")); - } - - @Test - public void should_support_underscores_in_key_names() throws Exception { - Toml toml = new Toml().read("a_a = 1"); - - assertEquals(1, toml.getLong("a_a").intValue()); - } - - @Test - public void should_support_underscores_in_table_names() throws Exception { - Toml toml = new Toml().read("[group_a]\na = 1"); - - assertEquals(1, toml.getLong("group_a.a").intValue()); - } - - @Test - public void should_support_numbers_in_key_names() throws Exception { - Toml toml = new Toml().read("a1 = 1"); - - assertEquals(1, toml.getLong("a1").intValue()); - } - - @Test - public void should_support_numbers_in_table_names() throws Exception { - Toml toml = new Toml().read("[group1]\na = 1"); - - assertEquals(1, toml.getLong("group1.a").intValue()); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_characters_outside_accept_range_are_used_in_table_name() throws Exception { - new Toml().read("[~]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_characters_outside_accept_range_are_used_in_table_array_name() throws Exception { - new Toml().read("[[~]]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_dots_in_key_name() throws Exception { - new Toml().read("a.b = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_characters_outside_accept_range_are_used_in_key_name() throws Exception { - new Toml().read("~ = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_sharp_sign_in_table_name() throws Exception { - new Toml().read("[group#]\nkey=1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_spaces_in_table_name() throws Exception { - new Toml().read("[valid key]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_sharp_sign_in_table_array_name() throws Exception { - new Toml().read("[[group#]]\nkey=1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_spaces_in_table_array_name() throws Exception { - new Toml().read("[[valid key]]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_question_marks_in_key_name() throws Exception { - new Toml().read("key?=true"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_empty_table_name() { - new Toml().read("[]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_name_ending_with_empty_table_name() { - new Toml().read("[a.]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_name_containing_empty_table_name() { - new Toml().read("[a..b]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_name_starting_with_empty_table_name() { - new Toml().read("[.b]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_array_name_ending_with_empty_table_name() { - new Toml().read("[[a.]]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_array_name_containing_empty_table_name() { - new Toml().read("[[a..b]]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_nested_table_array_name_starting_with_empty_table_name() { - new Toml().read("[[.b]]"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/BooleanTest.java b/src/test/java/com/moandjiezana/toml/BooleanTest.java deleted file mode 100644 index fb3d1a1..0000000 --- a/src/test/java/com/moandjiezana/toml/BooleanTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -public class BooleanTest { - - @Test - public void should_get_boolean() throws Exception { - Toml toml = new Toml().read("bool_false = false\nbool_true = true"); - - assertFalse(toml.getBoolean("bool_false")); - assertTrue(toml.getBoolean("bool_true")); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_invalid_boolean_true() { - new Toml().read("answer = true abc"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_invalid_boolean_false() { - new Toml().read("answer = false abc"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/BurntSushiInvalidTest.java b/src/test/java/com/moandjiezana/toml/BurntSushiInvalidTest.java deleted file mode 100644 index 8e28f42..0000000 --- a/src/test/java/com/moandjiezana/toml/BurntSushiInvalidTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.moandjiezana.toml; - -import java.io.IOException; -import java.io.InputStream; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; - -public class BurntSushiInvalidTest { - private InputStream inputToml; - - @Test - public void key_empty() throws Exception { - runInvalidTest("key-empty"); - } - - @Test - public void key_hash() throws Exception { - runInvalidTest("key-hash"); - } - - @Test - public void key_newline() throws Exception { - runInvalidTest("key-newline"); - } - - @Test - public void key_open_bracket() throws Exception { - runInvalidTest("key-open-bracket"); - } - - @Test - public void key_single_open_bracket() throws Exception { - runInvalidTest("key-single-open-bracket"); - } - - @Test - public void key_start_bracket() throws Exception { - runInvalidTest("key-start-bracket"); - } - - @Test - public void key_two_equals() throws Exception { - runInvalidTest("key-two-equals"); - } - - @Test - public void string_bad_byte_escape() throws Exception { - runInvalidTest("string-bad-byte-escape"); - } - - @Test - public void string_bad_escape() throws Exception { - runInvalidTest("string-bad-escape"); - } - - @Test - public void string_byte_escapes() throws Exception { - runInvalidTest("string-byte-escapes"); - } - - @Test - public void string_no_close() throws Exception { - runInvalidTest("string-no-close"); - } - - @Test - public void table_array_implicit() throws Exception { - runInvalidTest("table-array-implicit"); - } - - @Test - public void table_array_malformed_bracket() throws Exception { - runInvalidTest("table-array-malformed-bracket"); - } - - @Test - public void table_array_malformed_empty() throws Exception { - runInvalidTest("table-array-malformed-empty"); - } - - @Test - public void table_empty() throws Exception { - runInvalidTest("table-empty"); - } - - @Test - public void table_nested_brackets_close() throws Exception { - runInvalidTest("table-nested-brackets-close"); - } - - @Test - public void table_nested_brackets_open() throws Exception { - runInvalidTest("table-nested-brackets-open"); - } - - @Test - public void empty_implicit_table() { - runInvalidTest("empty-implicit-table"); - } - - @Test - public void empty_table() throws Exception { - runInvalidTest("empty-table"); - } - - @Test - public void array_mixed_types_ints_and_floats() throws Exception { - runInvalidTest("array-mixed-types-ints-and-floats"); - } - - @Test - public void array_mixed_types_arrays_and_ints() throws Exception { - runInvalidTest("array-mixed-types-arrays-and-ints"); - } - - @Test - public void array_mixed_types_strings_and_ints() throws Exception { - runInvalidTest("array-mixed-types-strings-and-ints"); - } - - @Test - public void datetime_malformed_no_leads() throws Exception { - runInvalidTest("datetime-malformed-no-leads"); - } - - @Test - public void datetime_malformed_no_secs() throws Exception { - runInvalidTest("datetime-malformed-no-secs"); - } - - @Test - public void datetime_malformed_no_t() throws Exception { - runInvalidTest("datetime-malformed-no-t"); - } - - @Test - public void datetime_malformed_no_z() throws Exception { - runInvalidTest("datetime-malformed-no-z"); - } - - @Test - public void datetime_malformed_with_milli() throws Exception { - runInvalidTest("datetime-malformed-with-milli"); - } - - @Test - public void duplicate_key_table() throws Exception { - runInvalidTest("duplicate-key-table"); - } - - @Test - public void duplicate_keys() throws Exception { - runInvalidTest("duplicate-keys"); - } - - @Test - public void duplicate_tables() throws Exception { - runInvalidTest("duplicate-tables"); - } - - @Test - public void float_no_leading_zero() throws Exception { - runInvalidTest("float-no-leading-zero"); - } - - @Test - public void float_no_trailing_digits() throws Exception { - runInvalidTest("float-no-trailing-digits"); - } - - @Test - public void text_after_array_entries() throws Exception { - runInvalidTest("text-after-array-entries"); - } - - @Test - public void text_after_integer() throws Exception { - runInvalidTest("text-after-integer"); - } - - @Test - public void text_after_string() throws Exception { - runInvalidTest("text-after-string"); - } - - @Test - public void text_after_table() throws Exception { - runInvalidTest("text-after-table"); - } - - @Test - public void text_before_array_separator() throws Exception { - runInvalidTest("text-before-array-separator"); - } - - @Test - public void text_in_array() throws Exception { - runInvalidTest("text-in-array"); - } - - @After - public void after() throws IOException { - inputToml.close(); - } - - private void runInvalidTest(String testName) { - inputToml = getClass().getResourceAsStream("burntsushi/invalid/" + testName + ".toml"); - - try { - new Toml().read(inputToml); - Assert.fail("Should have rejected invalid input!"); - } catch (IllegalStateException e) { - // success - } - } -} diff --git a/src/test/java/com/moandjiezana/toml/BurntSushiValidEncoderTest.java b/src/test/java/com/moandjiezana/toml/BurntSushiValidEncoderTest.java deleted file mode 100644 index 2537d95..0000000 --- a/src/test/java/com/moandjiezana/toml/BurntSushiValidEncoderTest.java +++ /dev/null @@ -1,214 +0,0 @@ -package com.moandjiezana.toml; - -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import org.junit.*; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import static org.junit.Assert.*; - -public class BurntSushiValidEncoderTest { - - @Test - public void array_empty() throws Exception { - runEncoder("array-empty"); - } - - @Test - public void arrays_hetergeneous() throws Exception { - runEncoder("arrays-hetergeneous"); - } - - @Test - public void arrays_nested() throws Exception { - runEncoder("arrays-nested"); - } - - @Test - public void datetime() throws Exception { - runEncoder("datetime"); - } - - @Test - public void empty() throws Exception { - runEncoder("empty"); - } - - @Test - public void example() throws Exception { - runEncoder("example"); - } - - @Test - public void float_() throws Exception { - runEncoder("float"); - } - - - @Test - public void implicit_and_explicit_before() throws Exception { - runEncoder("implicit-and-explicit-before"); - } - - @Test - public void implicit_groups() throws Exception { - runEncoder("implicit-groups"); - } - - @Test - public void long_float() throws Exception { - runEncoder("long-float"); - } - - @Test - public void long_integer() throws Exception { - runEncoder("long-integer"); - } - - @Test - public void key_special_chars_modified() throws Exception { - runEncoder("key-special-chars-modified"); - } - - @Test - public void integer() throws Exception { - runEncoder("integer"); - } - - @Test - public void string_empty() throws Exception { - runEncoder("string-empty"); - } - - @Test - public void string_escapes_modified() throws Exception { - runEncoder("string-escapes-modified"); - } - - @Test - public void string_simple() throws Exception { - runEncoder("string-simple"); - } - - @Test - public void table_array_implicit() throws Exception { - runEncoder("table-array-implicit"); - } - - @Test - public void table_array_many() throws Exception { - runEncoder("table-array-many"); - } - - @Test - public void table_array_nest_modified() throws Exception { - // Modified to remove stray spaces in the expected TOML - runEncoder("table-array-nest-modified", - new TomlWriter.Builder().indentTablesBy(2).build()); - } - - @Test - public void table_array_one() throws Exception { - runEncoder("table-array-one"); - } - - private static final Gson GSON = new Gson(); - - private void runEncoder(String testName) { - runEncoder(testName, new TomlWriter()); - } - - private void runEncoder(String testName, TomlWriter tomlWriter) { - InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml"); - String expectedToml = convertStreamToString(inputTomlStream).replaceAll("\r\n", "\n"); - - Reader inputJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json")); - JsonElement jsonInput = GSON.fromJson(inputJsonReader, JsonElement.class); - Map enriched = enrichJson(jsonInput.getAsJsonObject()); - - String encoded = tomlWriter.write(enriched); - assertEquals(expectedToml, encoded); - } - - // Enrich toml-test JSON trees into native Java types, suiteable - // for consumption by TomlWriter. - private Map enrichJson(JsonObject jsonObject) { - Map enriched = new LinkedHashMap(); - for (Map.Entry entry : jsonObject.entrySet()) { - enriched.put(entry.getKey(), enrichJsonElement(entry.getValue())); - } - - return enriched; - } - - Object enrichJsonElement(JsonElement jsonElement) { - if (jsonElement.isJsonObject()) { - JsonObject jsonObject = jsonElement.getAsJsonObject(); - if (jsonObject.has("type") && jsonObject.has("value")) { - return enrichPrimitive(jsonObject); - } - return enrichJson(jsonElement.getAsJsonObject()); - } else if (jsonElement.isJsonArray()) { - List tables = new LinkedList(); - for (JsonElement arrayElement : jsonElement.getAsJsonArray()) { - tables.add(enrichJsonElement(arrayElement)); - } - - return tables; - } - - throw new AssertionError("received unexpected JsonElement: " + jsonElement); - } - - private Object enrichPrimitive(JsonObject jsonObject) { - String type = jsonObject.getAsJsonPrimitive("type").getAsString(); - if ("bool".equals(type)) { - return jsonObject.getAsJsonPrimitive("value").getAsBoolean(); - } else if ("integer".equals(type)) { - return jsonObject.getAsJsonPrimitive("value").getAsBigInteger(); - } else if ("float".equals(type)) { - return jsonObject.getAsJsonPrimitive("value").getAsDouble(); - } else if ("string".equals(type)) { - return jsonObject.getAsJsonPrimitive("value").getAsString(); - } else if ("datetime".equals(type)) { - DateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); - iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC")); - String dateString = jsonObject.getAsJsonPrimitive("value").getAsString(); - try { - return iso8601Format.parse(dateString); - } catch (ParseException e) { - throw new AssertionError("failed to parse datetime '" + dateString + "': " + e.getMessage()); - } - } else if ("array".equals(type)) { - JsonArray jsonArray = jsonObject.getAsJsonArray("value"); - List enriched = new LinkedList(); - for (JsonElement arrayElement : jsonArray) { - enriched.add(enrichJsonElement(arrayElement)); - } - - return enriched; - } - - throw new AssertionError("enrichPrimitive: received unknown type " + type); - } - - static String convertStreamToString(java.io.InputStream is) { - java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); - return s.hasNext() ? s.next() : ""; - } - -} diff --git a/src/test/java/com/moandjiezana/toml/BurntSushiValidTest.java b/src/test/java/com/moandjiezana/toml/BurntSushiValidTest.java deleted file mode 100644 index 60b95d2..0000000 --- a/src/test/java/com/moandjiezana/toml/BurntSushiValidTest.java +++ /dev/null @@ -1,361 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.lang.reflect.Type; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -import org.junit.Ignore; -import org.junit.Test; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -public class BurntSushiValidTest { - - - @Test - public void array_empty() throws Exception { - run("array-empty"); - } - - @Test - public void array_nospaces() throws Exception { - run("array-nospaces"); - } - - @Test - public void arrays_hetergeneous() throws Exception { - run("arrays-hetergeneous"); - } - - @Test - public void arrays_nested() throws Exception { - run("arrays-nested"); - } - - @Test - public void arrays() throws Exception { - run("arrays"); - } - - @Test - public void bool() throws Exception { - run("bool"); - } - - @Test - public void comments_everywhere() throws Exception { - run("comments-everywhere"); - } - - @Test - public void datetime() throws Exception { - run("datetime"); - } - - @Test - public void empty() throws Exception { - run("empty"); - } - - @Test - public void example() throws Exception { - run("example"); - } - - @Test - public void float_() throws Exception { - run("float"); - } - - @Test - public void implicit_and_explicit_after() throws Exception { - run("implicit-and-explicit-after"); - } - - @Test - public void implicit_and_explicit_before() throws Exception { - run("implicit-and-explicit-before"); - } - - @Test - public void implicit_groups() throws Exception { - run("implicit-groups"); - } - - @Test - public void integer() throws Exception { - run("integer"); - } - - @Test - public void key_equals_nospace() throws Exception { - run("key-equals-nospace"); - } - - @Test @Ignore - public void key_space() throws Exception { - run("key-space"); - } - - @Test - public void key_space_modified() throws Exception { - run("key-space-modified"); - } - - @Test @Ignore - public void key_special_chars() throws Exception { - run("key-special-chars"); - } - - @Test - public void key_special_chars_modified() throws Exception { - run("key-special-chars-modified"); - } - - @Test @Ignore - public void keys_with_dots() throws Exception { - run("keys-with-dots"); - } - - @Test - public void keys_with_dots_modified() throws Exception { - run("keys-with-dots-modified"); - } - - @Test - public void long_float() throws Exception { - run("long-float"); - } - - @Test - public void long_integer() throws Exception { - run("long-integer"); - } - - @Test @Ignore - public void multiline_string() throws Exception { - run("multiline-string"); - } - - @Test - public void multiline_string_modified() throws Exception { - run("multiline-string-modified"); - } - - @Test - public void raw_multiline_string() throws Exception { - run("raw-multiline-string"); - } - - @Test - public void raw_string() throws Exception { - run("raw-string"); - } - - @Test - public void string_empty() throws Exception { - run("string-empty"); - } - - @Test @Ignore - public void string_escapes() throws Exception { - run("string-escapes-modified"); - } - - @Test - public void string_escapes_modified() throws Exception { - run("string-escapes-modified"); - } - - @Test - public void string_simple() throws Exception { - run("string-simple"); - } - - @Test - public void string_with_pound() throws Exception { - run("string-with-pound"); - } - - @Test - public void table_array_implicit() throws Exception { - run("table-array-implicit"); - } - - @Test - public void table_array_many() throws Exception { - run("table-array-many"); - } - - @Test - public void table_array_nest() throws Exception { - run("table-array-nest"); - } - - @Test - public void table_array_one() throws Exception { - run("table-array-one"); - } - - @Test - public void table_empty() throws Exception { - run("table-empty"); - } - - @Test - public void table_sub_empty() throws Exception { - run("table-sub-empty"); - } - - @Test @Ignore - public void table_whitespace() throws Exception { - run("table-whitespace"); - } - - @Test @Ignore - public void table_with_pound() throws Exception { - run("table-with-pound"); - } - - @Test - public void unicode_escape() throws Exception { - run("unicode-escape"); - } - - @Test - public void unicode_literal() throws Exception { - run("unicode-literal"); - } - - private void run(String testName) { - InputStream inputTomlStream = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml"); - // InputStream inputToml = getClass().getResourceAsStream("burntsushi/valid/" + testName + ".toml"); - String inputToml = convertStreamToString(inputTomlStream).replaceAll("\r\n", "\n"); - Reader expectedJsonReader = new InputStreamReader(getClass().getResourceAsStream("burntsushi/valid/" + testName + ".json")); - JsonElement expectedJson = GSON.fromJson(expectedJsonReader, JsonElement.class); - - Toml toml = new Toml().read(inputToml); - JsonElement actual = TEST_GSON.toJsonTree(toml).getAsJsonObject().get("values"); - - assertEquals(expectedJson, actual); - - try { - inputTomlStream.close(); - } catch (IOException e) {} - - try { - expectedJsonReader.close(); - } catch (IOException e) {} - } - - static String convertStreamToString(java.io.InputStream is) { - java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); - return s.hasNext() ? s.next() : ""; - } - - private static final Gson GSON = new Gson(); - private static final Gson TEST_GSON = new GsonBuilder() - .registerTypeAdapter(Boolean.class, serialize(Boolean.class)) - .registerTypeAdapter(String.class, serialize(String.class)) - .registerTypeAdapter(Long.class, serialize(Long.class)) - .registerTypeAdapter(Double.class, serialize(Double.class)) - .registerTypeAdapter(Date.class, new JsonSerializer() { - @Override - public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { - DateFormat iso8601Format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); - iso8601Format.setTimeZone(TimeZone.getTimeZone("UTC")); - return context.serialize(new Value("datetime", iso8601Format.format(src))); - } - }) - .registerTypeHierarchyAdapter(List.class, new JsonSerializer>() { - @Override - public JsonElement serialize(List src, Type typeOfSrc, JsonSerializationContext context) { - JsonArray array = new JsonArray(); - for (Object o : src) { - array.add(context.serialize(o)); - } - - if (!src.isEmpty() && src.get(0) instanceof Map) { - return array; - } - - JsonObject object = new JsonObject(); - object.add("type", new JsonPrimitive("array")); - object.add("value", array); - - return object; - } - }) - .registerTypeAdapter(Value.class, new JsonSerializer() { - @Override - public JsonElement serialize(Value src, Type typeOfSrc, JsonSerializationContext context) { - JsonObject object = new JsonObject(); - object.add("type", new JsonPrimitive(src.type)); - object.add("value", new JsonPrimitive(src.value)); - - return object; - } - }) - .create(); - - private static class Value { - public final String type; - public final String value; - - public Value(String type, String value) { - this.type = type; - this.value = value; - } - } - - private static JsonSerializer serialize(final Class aClass) { - return new JsonSerializer() { - @Override - public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { - return context.serialize(new Value(toTomlType(aClass), src.toString())); - } - }; - } - - private static String toTomlType(Class aClass) { - if (aClass == String.class) { - return "string"; - } - - if (aClass == Double.class) { - return "float"; - } - - if (aClass == Long.class) { - return "integer"; - } - - if (aClass == Date.class) { - return "datetime"; - } - - if (aClass == Boolean.class) { - return "bool"; - } - - return "array"; - } -} diff --git a/src/test/java/com/moandjiezana/toml/ContainsTest.java b/src/test/java/com/moandjiezana/toml/ContainsTest.java deleted file mode 100644 index e3e5f35..0000000 --- a/src/test/java/com/moandjiezana/toml/ContainsTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -public class ContainsTest { - - @Test - public void should_contain_top_level_of_any_type() throws Exception { - Toml toml = new Toml().read("a = 1 \n [b] \n b1 = 1 \n [[c]] \n c1 = 1"); - - assertTrue(toml.contains("a")); - assertTrue(toml.contains("b")); - assertTrue(toml.contains("c")); - assertFalse(toml.contains("d")); - } - - @Test - public void should_contain_nested_of_any_type() throws Exception { - Toml toml = new Toml().read("[a] \n a1 = 1 \n [[b]] \n b1 = 1 \n [[b]] \n b1 = 2 \n b2 = 3"); - - assertTrue(toml.contains("a.a1")); - assertTrue(toml.contains("b[0].b1")); - assertTrue(toml.contains("b[1].b1")); - assertFalse(toml.contains("b[2].b1")); - assertFalse(toml.contains("c.d")); - } - - @Test - public void should_contain_primitive() throws Exception { - Toml toml = new Toml().read("a = 1 \n [b] \n b1 = 1 \n [[c]] \n c1 = 1"); - - assertTrue(toml.containsPrimitive("a")); - assertTrue(toml.containsPrimitive("b.b1")); - assertTrue(toml.containsPrimitive("c[0].c1")); - assertFalse(toml.containsPrimitive("b")); - assertFalse(toml.containsPrimitive("c")); - assertFalse(toml.containsPrimitive("d")); - } - - @Test - public void should_contain_table() throws Exception { - Toml toml = new Toml().read("a = 1 \n [b] \n b1 = 1 \n [b.b2] \n [[c]] \n c1 = 1 \n [c.c2]"); - - assertTrue(toml.containsTable("b")); - assertTrue(toml.containsTable("b.b2")); - assertTrue(toml.containsTable("c[0].c2")); - assertFalse(toml.containsTable("a")); - assertFalse(toml.containsTable("b.b1")); - assertFalse(toml.containsTable("c")); - assertFalse(toml.containsTable("c[0].c1")); - assertFalse(toml.containsTable("d")); - } - - @Test - public void should_contain_table_array() throws Exception { - Toml toml = new Toml().read("a = 1 \n [b] \n b1 = 1 \n [[c]] \n c1 = 1 \n [c.c2] \n [[c]] \n [[c.c3]] \n c4 = 4"); - - assertTrue(toml.containsTableArray("c")); - assertTrue(toml.containsTableArray("c[1].c3")); - assertFalse(toml.containsTableArray("a")); - assertFalse(toml.containsTableArray("b")); - assertFalse(toml.containsTableArray("b.b1")); - assertFalse(toml.containsTableArray("c[1].c3[0].c4")); - assertFalse(toml.containsTableArray("d")); - } - - @Test - public void should_not_contain_when_parent_table_is_missing() throws Exception { - Toml toml = new Toml().read("a = \"1\""); - - assertFalse(toml.contains("b.b1")); - assertFalse(toml.containsPrimitive("b.b1")); - assertFalse(toml.containsTable("b.b1")); - assertFalse(toml.containsTableArray("b.b1")); - } -} diff --git a/src/test/java/com/moandjiezana/toml/DateTest.java b/src/test/java/com/moandjiezana/toml/DateTest.java deleted file mode 100644 index dce1e57..0000000 --- a/src/test/java/com/moandjiezana/toml/DateTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; - -import java.util.Calendar; -import java.util.TimeZone; - -import org.junit.Test; - -public class DateTest { - - private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); - - @Test - public void should_get_date() throws Exception { - Toml toml = new Toml().read("a_date = 2011-11-10T13:12:00Z"); - - Calendar calendar = Calendar.getInstance(UTC); - calendar.set(2011, Calendar.NOVEMBER, 10, 13, 12, 00); - calendar.set(Calendar.MILLISECOND, 0); - - assertEquals(calendar.getTime(), toml.getDate("a_date")); - } - - @Test - public void should_get_date_with_offset() throws Exception { - Toml toml = new Toml().read("a_date = 1979-05-27T00:32:00-07:00"); - - Calendar calendar = Calendar.getInstance(UTC); - calendar.set(1979, Calendar.MAY, 27, 7, 32, 0); - calendar.set(Calendar.MILLISECOND, 0); - - assertEquals(calendar.getTime(), toml.getDate("a_date")); - } - - @Test - public void should_get_date_with_positive_offset() throws Exception { - Toml toml = new Toml().read("a_date = 1979-05-27T07:32:00+07:00"); - - Calendar calendar = Calendar.getInstance(UTC); - calendar.set(1979, Calendar.MAY, 27, 0, 32, 0); - calendar.set(Calendar.MILLISECOND, 0); - - assertEquals(calendar.getTime(), toml.getDate("a_date")); - } - - @Test - public void should_get_date_with_fractional_seconds() throws Exception { - Toml toml = new Toml().read("a_date = 1979-05-27T00:32:00.999Z"); - - Calendar calendar = Calendar.getInstance(UTC); - calendar.set(1979, Calendar.MAY, 27, 0, 32, 00); - calendar.set(Calendar.MILLISECOND, 999); - - assertEquals(calendar.getTime(), toml.getDate("a_date")); - } - - @Test - public void should_get_date_with_fractional_seconds_and_offset() throws Exception { - Toml toml = new Toml().read("a_date = 1979-05-27T00:32:00.999-07:00"); - - Calendar calendar = Calendar.getInstance(UTC); - calendar.set(1979, Calendar.MAY, 27, 7, 32, 00); - calendar.set(Calendar.MILLISECOND, 999); - - assertEquals(calendar.getTime(), toml.getDate("a_date")); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_non_existant_date() throws Exception { - new Toml().read("d = 2012-13-01T15:00:00Z"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/DefaultValueTest.java b/src/test/java/com/moandjiezana/toml/DefaultValueTest.java deleted file mode 100644 index ee9308f..0000000 --- a/src/test/java/com/moandjiezana/toml/DefaultValueTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.moandjiezana.toml; - -import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.TimeZone; - -import org.junit.Test; - -public class DefaultValueTest { - private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); - - private static final Calendar CALENDAR = Calendar.getInstance(UTC); - private static final Date _2011_11_10; - private static final Date _2012_11_10; - - static { - CALENDAR.set(2011, Calendar.NOVEMBER, 10, 13, 12, 00); - CALENDAR.set(Calendar.MILLISECOND, 0); - _2011_11_10 = CALENDAR.getTime(); - CALENDAR.set(Calendar.YEAR, 2012); - _2012_11_10 = CALENDAR.getTime(); - } - - @Test - public void should_get_string() throws Exception { - Toml toml = new Toml().read("s = \"string value\""); - assertEquals("string value", toml.getString("s", "default string value")); - } - - @Test - public void should_get_string_default_value() throws Exception { - Toml toml = new Toml().read(""); - assertEquals("default string value", toml.getString("s", "default string value")); - } - - @Test - public void should_get_long() throws Exception { - Toml toml = new Toml().read("n = 1001"); - assertEquals(Long.valueOf(1001), toml.getLong("n", 1002L)); - } - - @Test - public void should_get_long_default_value() throws Exception { - Toml toml = new Toml().read(""); - assertEquals(Long.valueOf(1002), toml.getLong("n", 1002L)); - } - - @Test - public void should_get_double() throws Exception { - Toml toml = new Toml().read("n = 0.5"); - assertEquals(Double.valueOf(0.5), toml.getDouble("n", Double.valueOf(0.6))); - } - - @Test - public void should_get_double_default_value() throws Exception { - Toml toml = new Toml().read(""); - assertEquals(Double.valueOf(0.6), toml.getDouble("n", Double.valueOf(0.6))); - } - - @Test - public void should_get_boolean() throws Exception { - Toml toml = new Toml().read("b = true"); - assertEquals(Boolean.TRUE, toml.getBoolean("b", Boolean.FALSE)); - } - - @Test - public void should_get_boolean_default_value() throws Exception { - Toml toml = new Toml().read(""); - assertEquals(Boolean.FALSE, toml.getBoolean("b", Boolean.FALSE)); - } - - @Test - public void should_get_date() throws Exception { - Toml toml = new Toml().read("d = 2011-11-10T13:12:00Z"); - - assertEquals(_2011_11_10, toml.getDate("d", _2012_11_10)); - } - - @Test - public void should_get_date_default_value() throws Exception { - Toml toml = new Toml().read(""); - - assertEquals(_2012_11_10, toml.getDate("d", _2012_11_10)); - } - - @Test - public void should_get_array() throws Exception { - Toml toml = new Toml().read("a = [1, 2, 3]\n b = []"); - - assertEquals(asList(1L, 2L, 3L), toml.getList("a", asList(3L, 2L, 1L))); - assertEquals(Collections.emptyList(), toml.getList("b", asList(3L, 2L, 1L))); - } - - @Test - public void should_get_empty_array() throws Exception { - Toml toml = new Toml().read("a = []"); - - assertEquals(Collections.emptyList(), toml.getList("a", asList(3L, 2L, 1L))); - } - - @Test - public void should_get_array_default_value() throws Exception { - Toml toml = new Toml(); - - assertEquals(asList(3L, 2L, 1L), toml.getList("a", asList(3L, 2L, 1L))); - } - - @Test - public void should_prefer_default_from_constructor() throws Exception { - Toml defaults = new Toml().read("n = 1\n d = 1.1\n b = true\n date = 2011-11-10T13:12:00Z\n s = 'a'\n a = [1, 2, 3]"); - Toml toml = new Toml(defaults).read(""); - - assertEquals(1, toml.getLong("n", 2L).intValue()); - assertEquals(1.1, toml.getDouble("d", 2.2), 0); - assertTrue(toml.getBoolean("b", false)); - assertEquals(_2011_11_10, toml.getDate("date", _2012_11_10)); - assertEquals("a", toml.getString("s", "b")); - assertEquals(asList(1L, 2L, 3L), toml.getList("a", asList(3L, 2L, 1L))); - } -} diff --git a/src/test/java/com/moandjiezana/toml/ErrorMessagesTest.java b/src/test/java/com/moandjiezana/toml/ErrorMessagesTest.java deleted file mode 100644 index f90f15a..0000000 --- a/src/test/java/com/moandjiezana/toml/ErrorMessagesTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.moandjiezana.toml; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -public class ErrorMessagesTest { - - @Rule - public final ExpectedException e = ExpectedException.none(); - - @Test - public void invalid_table() throws Exception { - e.expectMessage("Invalid table definition on line 1: [in valid]"); - - new Toml().read("[in valid]"); - } - - @Test - public void duplicate_table() throws Exception { - e.expectMessage("Duplicate table definition on line 2: [again]"); - - new Toml().read("[again]\n[again]"); - } - - @Test - public void empty_implicit_table_name() throws Exception { - e.expectMessage("Invalid table definition due to empty implicit table name: [a..b]"); - - new Toml().read("[a..b]"); - } - - @Test - public void duplicate_key() throws Exception { - e.expectMessage("Duplicate key on line 2: k"); - - new Toml().read("k = 1\n k = 2"); - } - - @Test - public void invalid_key() throws Exception { - e.expectMessage("Key is not followed by an equals sign on line 1: k\" = 1"); - - new Toml().read("k\" = 1"); - } - - @Test - public void invalid_table_array() throws Exception { - e.expectMessage("Invalid table array definition on line 1: [[in valid]]"); - - new Toml().read("[[in valid]]"); - } - - @Test - public void invalid_value() throws Exception { - e.expectMessage("Invalid text after key k on line 1"); - - new Toml().read("k = 1 t"); - } - - @Test - public void unterminated_multiline_literal_string() throws Exception { - e.expectMessage("Unterminated value on line 1: k = '''abc"); - - new Toml().read("k = '''abc"); - } - - @Test - public void unterminated_multiline_string() throws Exception { - e.expectMessage("Unterminated value on line 1: k = \"\"\"abc\"\""); - - new Toml().read("k = \"\"\"abc\"\""); - } - - @Test - public void unterminated_array() throws Exception { - e.expectMessage("Unterminated value on line 1: k = [\"abc\""); - - new Toml().read("k = [\"abc\""); - } - - @Test - public void unterminated_inline_table() throws Exception { - e.expectMessage("Unterminated value on line 1: k = { a = \"abc\""); - - new Toml().read("k = { a = \"abc\""); - } - - @Test - public void key_without_equals() throws Exception { - e.expectMessage("Key is not followed by an equals sign on line 2: k"); - - new Toml().read("\nk\n=3"); - } - - @Test - public void heterogeneous_array() throws Exception { - e.expectMessage("k becomes a heterogeneous array on line 2"); - - new Toml().read("k = [ 1,\n 1.1 ]"); - } - - @Test - public void key_in_root_is_overwritten_by_table() throws Exception { - e.expectMessage("Key already exists for table defined on line 2: [a]"); - - new Toml().read("a=1\n [a]"); - } - - @Test - public void table_is_overwritten_by_key() throws Exception { - e.expectMessage("Table already exists for key defined on line 3: b"); - - new Toml().read("[a.b]\n [a]\n b=1"); - } - - @Test - public void should_display_correct_line_number_with_literal_multiline_string() throws Exception { - e.expectMessage("on line 8"); - - new Toml().read("[table]\n\n k = '''abc\n\ndef\n'''\n # comment \n j = 4.\n l = 5"); - } - - @Test - public void should_display_correct_line_number_with_multiline_string() throws Exception { - e.expectMessage("on line 9"); - - new Toml().read("[table]\n\n k = \"\"\"\nabc\n\ndef\n\"\"\"\n # comment \n j = 4.\n l = 5"); - } - - @Test - public void should_display_correct_line_number_with_array() throws Exception { - e.expectMessage("on line 10"); - - new Toml().read("[table]\n\n k = [\"\"\"\nabc\n\ndef\n\"\"\"\n, \n # comment \n j = 4.,\n l = 5\n]"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/InlineTableTest.java b/src/test/java/com/moandjiezana/toml/InlineTableTest.java deleted file mode 100644 index f482471..0000000 --- a/src/test/java/com/moandjiezana/toml/InlineTableTest.java +++ /dev/null @@ -1,236 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.util.Calendar; -import java.util.List; -import java.util.TimeZone; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -public class InlineTableTest { - - private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); - - @Rule - public ExpectedException e = ExpectedException.none(); - - @Test - public void should_read_empty_inline_table() throws Exception { - Toml toml = new Toml().read("key = {}"); - - assertTrue(toml.getTable("key").isEmpty()); - } - - @Test - public void should_read_inline_table_with_strings() throws Exception { - Toml toml = new Toml().read("name = { first = \"Tom\", last = \"Preston-Werner\"}"); - - assertEquals("Tom", toml.getTable("name").getString("first")); - assertEquals("Preston-Werner", toml.getString("name.last")); - } - - @Test - public void should_read_inline_table_with_integers() throws Exception { - Toml toml = new Toml().read("point = { x = 1, y = 2 }"); - - assertEquals(1, toml.getTable("point").getLong("x").longValue()); - assertEquals(2, toml.getLong("point.y").longValue()); - } - - @Test - public void should_read_inline_table_with_floats() throws Exception { - Toml toml = new Toml().read("point = { x = 1.5, y = 2.3 }"); - - assertEquals(1.5, toml.getTable("point").getDouble("x").doubleValue(), 0); - assertEquals(2.3, toml.getDouble("point.y").doubleValue(), 0); - } - - @Test - public void should_read_inline_table_with_booleans() throws Exception { - Toml toml = new Toml().read("point = { x = false, y = true }"); - - assertTrue(toml.getTable("point").getBoolean("y")); - assertFalse(toml.getBoolean("point.x")); - } - - @Test - public void should_read_inline_table_with_dates() throws Exception { - Toml toml = new Toml().read("point = { x = 2015-02-09T22:05:00Z, y = 2015-02-09T21:05:00Z }"); - - Calendar x = Calendar.getInstance(UTC); - x.set(2015, Calendar.FEBRUARY, 9, 22, 5, 00); - x.set(Calendar.MILLISECOND, 0); - - Calendar y = Calendar.getInstance(UTC); - y.set(2015, Calendar.FEBRUARY, 9, 21, 5, 00); - y.set(Calendar.MILLISECOND, 0); - - assertEquals(x.getTime(), toml.getTable("point").getDate("x")); - assertEquals(y.getTime(), toml.getDate("point.y")); - } - - @Test - public void should_read_arrays() throws Exception { - Toml toml = new Toml().read("arrays = { integers = [1, 2, 3], strings = [\"a\", \"b\", \"c\"] }"); - - assertThat(toml.getList("arrays.integers"), contains(1L, 2L, 3L)); - assertThat(toml.getList("arrays.strings"), contains("a", "b", "c")); - } - - @Test - public void should_read_nested_arrays() throws Exception { - Toml toml = new Toml().read("arrays = { nested = [[1, 2, 3], [4, 5, 6]] }").getTable("arrays"); - - List> nested = toml.>getList("nested"); - assertThat(nested, hasSize(2)); - assertThat(nested.get(0), contains(1L, 2L, 3L)); - assertThat(nested.get(1), contains(4L, 5L, 6L)); - } - - @Test - public void should_read_mixed_inline_table() throws Exception { - Toml toml = new Toml().read("point = { date = 2015-02-09T22:05:00Z, bool = true, integer = 123, float = 123.456, string = \"abc\", list = [5, 6, 7, 8] }").getTable("point"); - - - Calendar date = Calendar.getInstance(UTC); - date.set(2015, Calendar.FEBRUARY, 9, 22, 5, 00); - date.set(Calendar.MILLISECOND, 0); - - assertEquals(date.getTime(), toml.getDate("date")); - assertTrue(toml.getBoolean("bool")); - assertEquals(123, toml.getLong("integer").intValue()); - assertEquals(123.456, toml.getDouble("float"), 0); - assertEquals("abc", toml.getString("string")); - assertThat(toml.getList("list"), contains(5L, 6L, 7L, 8L)); - } - - @Test - public void should_read_nested_inline_tables() throws Exception { - Toml tables = new Toml().read("tables = { t1 = { t1_1 = 1, t1_2 = 2}, t2 = { t2_1 = { t2_1_1 = \"a\" }} }").getTable("tables"); - - assertEquals(1L, tables.getLong("t1.t1_1").longValue()); - assertEquals(2L, tables.getLong("t1.t1_2").longValue()); - assertEquals("a", tables.getString("t2.t2_1.t2_1_1")); - } - - @Test - public void should_read_all_string_types() throws Exception { - Toml strings = new Toml().read("strings = { literal = 'ab]\"c', multiline = \"\"\"de]\"f\"\"\", multiline_literal = '''gh]\"i''' }").getTable("strings"); - - assertEquals("ab]\"c", strings.getString("literal")); - assertEquals("de]\"f", strings.getString("multiline")); - assertEquals("gh]\"i", strings.getString("multiline_literal")); - } - - @Test - public void should_read_inline_table_in_regular_table() throws Exception { - Toml toml = new Toml().read("[tbl]\n tbl = { tbl = 1 }"); - - assertEquals(1, toml.getLong("tbl.tbl.tbl").intValue()); - } - - @Test - public void should_mix_with_tables() throws Exception { - Toml toml = new Toml().read("t = { k = 1 }\n [b]\n k = 2\n t = { k = 3}"); - - assertEquals(1, toml.getLong("t.k").intValue()); - assertEquals(2, toml.getLong("b.k").intValue()); - assertEquals(3, toml.getLong("b.t.k").intValue()); - } - - @Test - public void should_add_properties_to_existing_inline_table() throws Exception { - Toml toml = new Toml().read("[a]\n b = {k = 1}\n [a.b.c]\n k = 2"); - - assertEquals(1, toml.getLong("a.b.k").intValue()); - assertEquals(2, toml.getLong("a.b.c.k").intValue()); - } - - @Test - public void should_mix_with_table_arrays() throws Exception { - Toml toml = new Toml().read("t = { k = 1 }\n [[b]]\n t = { k = 2 }\n [[b]]\n t = { k = 3 }"); - - assertEquals(1, toml.getLong("t.k").intValue()); - assertEquals(2, toml.getLong("b[0].t.k").intValue()); - assertEquals(3, toml.getLong("b[1].t.k").intValue()); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_invalid_key() throws Exception { - new Toml().read("tbl = { a. = 1 }"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_unterminated() throws Exception { - new Toml().read("tbl = { a = 1 "); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_invalid_value() throws Exception { - new Toml().read("tbl = { a = abc }"); - } - - @Test - public void should_fail_when_key_duplicated_inside_inline_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate key on line 1: a"); - - new Toml().read("tbl = { a = 1, a = 2 }"); - } - - @Test - public void should_fail_when_duplicated_by_other_key() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Table already exists for key defined on line 2: tbl"); - - new Toml().read("tbl = { a = 1 }\n tbl = 1"); - } - - @Test - public void should_fail_when_duplicated_by_other_inline_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate table definition on line 2: [tbl]"); - - new Toml().read("tbl = { a = 1 }\n tbl = {}"); - } - - @Test - public void should_fail_when_duplicated_by_top_level_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate table definition on line 2: [tbl]"); - - new Toml().read("tbl = {}\n [tbl]"); - } - - @Test - public void should_fail_when_duplicates_second_level_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate table definition on line 3: [a.b]"); - - new Toml().read("[a.b]\n [a]\n b = {}"); - } - - @Test - public void should_fail_when_inline_table_duplicates_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate table definition on line 3: [a.b]"); - - new Toml().read("[a.b]\n [a]\n b = {}"); - } - - @Test - public void should_fail_when_second_level_table_duplicates_inline_table() throws Exception { - e.expect(IllegalStateException.class); - e.expectMessage("Duplicate table definition on line 3: [a.b]"); - - new Toml().read("[a]\n b = {}\n [a.b]"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/IterationTest.java b/src/test/java/com/moandjiezana/toml/IterationTest.java deleted file mode 100644 index d6f52ae..0000000 --- a/src/test/java/com/moandjiezana/toml/IterationTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.moandjiezana.toml; - -import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.hasEntry; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import com.moandjiezana.toml.testutils.Utils; - -public class IterationTest { - - @Rule - public final ExpectedException expectedException = ExpectedException.none(); - - @Test - public void should_iterate_over_primitive() throws Exception { - Toml toml = new Toml().read(file("long")); - Map.Entry entry = toml.entrySet().iterator().next(); - - assertEquals("long", entry.getKey()); - assertEquals(2L, entry.getValue()); - } - - @Test - @SuppressWarnings("unchecked") - public void should_iterate_over_list() throws Exception { - Toml toml = new Toml().read(file("list")); - Map.Entry entry = toml.entrySet().iterator().next(); - - assertEquals("list", entry.getKey()); - assertThat((List) entry.getValue(), contains("a", "b", "c")); - } - - @Test - @SuppressWarnings("unchecked") - public void should_iterate_over_empty_list() throws Exception { - Toml toml = new Toml().read("list = []"); - Map.Entry entry = toml.entrySet().iterator().next(); - - assertEquals("list", entry.getKey()); - assertThat((List) entry.getValue(), empty()); - } - - @Test - public void should_iterate_over_table() throws Exception { - Toml toml = new Toml().read(file("table")); - Map.Entry entry = toml.entrySet().iterator().next(); - - assertEquals("table", entry.getKey()); - assertEquals("a", ((Toml) entry.getValue()).getString("a")); - } - - @Test - @SuppressWarnings("unchecked") - public void should_iterate_over_table_array() throws Exception { - Toml toml = new Toml().read(file("table_array")); - - Map.Entry entry = toml.entrySet().iterator().next(); - List tableArray = (List) entry.getValue(); - - assertEquals("table_array", entry.getKey()); - assertThat(tableArray, contains(instanceOf(Toml.class), instanceOf(Toml.class))); - } - - @Test - @SuppressWarnings("unchecked") - public void should_iterate_over_multiple_entries() throws Exception { - Toml toml = new Toml().read(file("multiple")); - - Map entries = new HashMap(); - for (Map.Entry entry : toml.entrySet()) { - entries.put(entry.getKey(), entry.getValue()); - } - - assertThat(entries.keySet(), containsInAnyOrder("a", "b", "c", "e")); - assertThat(entries, hasEntry("a", (Object) "a")); - assertThat(entries, hasEntry("b", (Object) asList(1L, 2L, 3L))); - assertTrue(((Toml) entries.get("c")).getBoolean("d")); - assertThat(((List) entries.get("e")), hasSize(1)); - } - - @Test - public void should_not_support_setValue_method() throws Exception { - Map.Entry entry = new Toml().read("a = 1").entrySet().iterator().next(); - - expectedException.expect(UnsupportedOperationException.class); - entry.setValue(2L); - } - - @Test - public void should_not_iterate_over_empty_toml() throws Exception { - Toml toml = new Toml().read(""); - - assertThat(toml.entrySet(), empty()); - } - - private File file(String name) { - return Utils.file(getClass(), "/IteratorTest/" + name); - } -} diff --git a/src/test/java/com/moandjiezana/toml/NumberTest.java b/src/test/java/com/moandjiezana/toml/NumberTest.java deleted file mode 100644 index d69501a..0000000 --- a/src/test/java/com/moandjiezana/toml/NumberTest.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class NumberTest { - @Test - public void should_get_number() throws Exception { - Toml toml = new Toml().read("b = 1001"); - - assertEquals(1001, toml.getLong("b").intValue()); - } - - @Test - public void should_get_negative_number() throws Exception { - Toml toml = new Toml().read("b = -1001"); - - assertEquals(-1001, toml.getLong("b").intValue()); - } - - @Test - public void should_get_number_with_plus_sign() throws Exception { - Toml toml = new Toml().read("a = +1001\nb = 1001"); - - assertEquals(toml.getLong("b"), toml.getLong("a")); - } - - @Test - public void should_get_double() throws Exception { - Toml toml = new Toml().read("double = 5.25"); - - assertEquals(5.25D, toml.getDouble("double").doubleValue(), 0.0); - } - - @Test - public void should_get_negative_double() throws Exception { - Toml toml = new Toml().read("double = -5.25"); - - assertEquals(-5.25D, toml.getDouble("double").doubleValue(), 0.0); - } - - @Test - public void should_get_double_with_a_plus_sign() throws Exception { - Toml toml = new Toml().read("double = +5.25"); - - assertEquals(5.25D, toml.getDouble("double").doubleValue(), 0.0); - } - - @Test - public void should_get_exponent() throws Exception { - Toml toml = new Toml().read("lower_case = 1e6\nupper_case = 2E6\nwith_plus = 5e+22\nboth_plus = +5E+22\nnegative = -2E-2\nfractional = 6.626e-34"); - - assertEquals(1e6, toml.getDouble("lower_case"), 0.0); - assertEquals(2E6, toml.getDouble("upper_case"), 0.0); - assertEquals(5e22, toml.getDouble("with_plus"), 0.0); - assertEquals(5e22, toml.getDouble("both_plus"), 0.0); - assertEquals(-2e-2, toml.getDouble("negative"), 0.0); - assertEquals(6.626D * Math.pow(10, -34), toml.getDouble("fractional"), 0.0); - } - - @Test - public void should_get_integer_with_underscores() throws Exception { - Toml toml = new Toml().read("val = 100_000_000"); - - assertEquals(100000000L, toml.getLong("val").intValue()); - } - - @Test - public void should_get_float_with_underscores() throws Exception { - Toml toml = new Toml().read("val = 100_000.123_456"); - - assertEquals(100000.123456, toml.getDouble("val").doubleValue(), 0); - } - - @Test - public void should_get_exponent_with_underscores() throws Exception { - Toml toml = new Toml().read("val = 1_5e1_00"); - - assertEquals(15e100, toml.getDouble("val").doubleValue(), 0.0); - } - - @Test - public void should_accept_irregular_underscores() throws Exception { - Toml toml = new Toml().read("val = 1_2_3_4_5"); - - assertEquals(12345L, toml.getLong("val").longValue()); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_invalid_number() throws Exception { - new Toml().read("a = 200-"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_illegal_characters_after_float() throws Exception { - new Toml().read("number = 3.14 pi"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_illegal_characters_after_integer() throws Exception { - new Toml().read("number = 314 pi"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_float_without_leading_0() { - new Toml().read("answer = .12345"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_negative_float_without_leading_0() { - new Toml().read("answer = -.12345"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_float_with_sign_after_dot() { - new Toml().read("answer = 1.-1"); - new Toml().read("answer = 1.+1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_float_without_digits_after_dot() { - new Toml().read("answer = 1."); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_negative_float_without_digits_after_dot() { - new Toml().read("answer = -1."); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_exponent_without_digits_after_dot() { - new Toml().read("answer = 1.E1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_negative_exponent_without_digits_after_dot() { - new Toml().read("answer = -1.E1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_exponent_with_dot_in_exponent_part() { - new Toml().read("answer = -1E1.0"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_exponent_without_numbers_after_E() { - new Toml().read("answer = -1E"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_exponent_with_two_E() { - new Toml().read("answer = -1E1E1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_float_with_two_dots() { - new Toml().read("answer = 1.1.1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_at_beginning() { - new Toml().read("answer = _1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_at_end() { - new Toml().read("answer = 1_"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_two_underscores_in_a_row() { - new Toml().read("answer = 1__1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_after_minus_sign() { - new Toml().read("answer = -_1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_after_plus_sign() { - new Toml().read("answer = +_1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_before_dot() { - new Toml().read("answer = 1_.1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_after_dot() { - new Toml().read("answer = 1._1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_before_E() { - new Toml().read("answer = 1_E1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_after_E() { - new Toml().read("answer = 1E_1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_underscore_followed_by_whitespace() { - new Toml().read("answer = _ 1"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/QuotedKeysTest.java b/src/test/java/com/moandjiezana/toml/QuotedKeysTest.java deleted file mode 100644 index 1366911..0000000 --- a/src/test/java/com/moandjiezana/toml/QuotedKeysTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -import java.util.Map; - -import org.junit.Test; - -public class QuotedKeysTest { - - @Test - public void should_accept_quoted_key_for_value() throws Exception { - Toml toml = new Toml().read("\"127.0.0.1\" = \"localhost\" \n \"character encoding\" = \"UTF-8\" \n \"ʎǝʞ\" = \"value\""); - - assertEquals("localhost", toml.getString("\"127.0.0.1\"")); - assertEquals("UTF-8", toml.getString("\"character encoding\"")); - assertEquals("value", toml.getString("\"ʎǝʞ\"")); - } - - @Test - public void should_accept_quoted_key_for_table_name() throws Exception { - Toml toml = new Toml().read("[\"abc def\"]\n val = 1"); - - assertEquals(1L, toml.getTable("\"abc def\"").getLong("val").longValue()); - } - - @Test - public void should_accept_partially_quoted_table_name() throws Exception { - Toml toml = new Toml().read("[dog.\"tater.man\"] \n type = \"pug0\" \n[dog.tater] \n type = \"pug1\"\n[dog.tater.man] \n type = \"pug2\""); - Toml dogs = toml.getTable("dog"); - - assertEquals("pug0", dogs.getTable("\"tater.man\"").getString("type")); - assertEquals("pug1", dogs.getTable("tater").getString("type")); - assertEquals("pug2", dogs.getTable("tater").getTable("man").getString("type")); - assertEquals("pug0", toml.getString("dog.\"tater.man\".type")); - assertEquals("pug2", toml.getString("dog.tater.man.type")); - } - - @Test - @SuppressWarnings("unchecked") - public void should_conserve_quoted_key_in_map() throws Exception { - Toml toml = new Toml().read("[dog.\"tater.man\"] \n type = \"pug0\" \n[dog.tater] \n type = \"pug1\"\n[dog.tater.man] \n type = \"pug2\""); - Toml dogs = toml.getTable("dog"); - - Map> map = dogs.to(Map.class); - - assertEquals("pug0", map.get("\"tater.man\"").get("type")); - assertEquals("pug1", map.get("tater").get("type")); - assertEquals("pug2", ((Map) map.get("tater").get("man")).get("type")); - } - - @Test - public void should_convert_quoted_keys_to_map_but_not_to_object_fields() throws Exception { - Quoted quoted = new Toml().read("\"ʎǝʞ\" = \"value\" \n[map] \n \"ʎǝʞ\" = \"value\"").to(Quoted.class); - - assertNull(quoted.ʎǝʞ); - assertEquals("value", quoted.map.get("\"ʎǝʞ\"")); - } - - @Test - public void should_support_table_array_index_with_quoted_key() throws Exception { - Toml toml = new Toml().read("[[ dog. \" type\" ]] \n name = \"type0\" \n [[dog.\" type\"]] \n name = \"type1\""); - - assertEquals("type0", toml.getString("dog.\" type\"[0].name")); - assertEquals("type1", toml.getString("dog.\" type\"[1].name")); - } - - @Test - public void should_support_table_array_index_with_dot_in_quoted_key() throws Exception { - Toml toml = new Toml().read("[[ dog. \"a.type\" ]] \n name = \"type0\""); - - assertEquals("type0", toml.getString("dog.\"a.type\"[0].name")); - } - - @Test - public void should_support_quoted_key_containing_square_brackets() throws Exception { - Toml toml = new Toml().read("[dog.\" type[abc]\"] \n name = \"type0\" \n [dog.\" type[1]\"] \n \"name[]\" = \"type1\""); - - assertEquals("type0", toml.getString("dog.\" type[abc]\".name")); - assertEquals("type1", toml.getString("dog.\" type[1]\".\"name[]\"")); - } - - @Test - public void should_support_quoted_key_containing_escaped_quote() throws Exception { - Toml toml = new Toml().read("[dog.\"ty\\\"pe\"] \n \"na\\\"me\" = \"type0\""); - - assertEquals("type0", toml.getString("dog.\"ty\\\"pe\".\"na\\\"me\"")); - } - - @Test - public void should_support_fully_quoted_table_name() throws Exception { - Toml toml = new Toml().read("[\"abc.def\"] \n key = 1"); - - assertEquals(1, toml.getLong("\"abc.def\".key").intValue()); - } - - @Test - public void should_support_whitespace_around_key_segments() throws Exception { - Toml toml = new Toml().read("[ dog. \"type\". breed ] \n name = \"type0\""); - - assertEquals("type0", toml.getString("dog.\"type\".breed.name")); - } - - @Test - public void should_support_unicode() throws Exception { - Toml toml = new Toml().read("[[\"\\u00B1\"]]\n \"\\u00B1\" = \"a\"\n [\"\\u00B11\"]\n \"±\" = 1"); - - assertThat(toml.getTables("\"±\""), hasSize(1)); - assertEquals("a", toml.getTables("\"±\"").get(0).getString("\"±\"")); - assertEquals(1, toml.getTable("\"±1\"").getLong("\"±\"").intValue()); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_malformed_quoted_key() throws Exception { - new Toml().read("k\"ey\" = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_malformed_quoted_table() throws Exception { - new Toml().read("[a\"bc\"]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_malformed_quoted_nested_table() throws Exception { - new Toml().read("[a.a\"bc\"]"); - } - - private static class Quoted { - - String ʎǝʞ; - - Map map; - } -} diff --git a/src/test/java/com/moandjiezana/toml/RealWorldTest.java b/src/test/java/com/moandjiezana/toml/RealWorldTest.java deleted file mode 100644 index 9343b8b..0000000 --- a/src/test/java/com/moandjiezana/toml/RealWorldTest.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.moandjiezana.toml; - -import static java.util.Arrays.asList; -import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.util.Arrays; -import java.util.Calendar; -import java.util.List; -import java.util.TimeZone; - -import org.junit.Test; - -public class RealWorldTest { - - @SuppressWarnings("unchecked") - @Test - public void should_parse_example() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("example.toml").getFile())); - - // printMap(root); - - assertEquals("TOML Example", toml.getString("title")); - - Toml owner = toml.getTable("owner"); - assertEquals("Tom Preston-Werner", owner.getString("name")); - assertEquals("GitHub", owner.getString("organization")); - assertEquals("GitHub Cofounder & CEO\nLikes tater tots and beer.", owner.getString("bio")); - - Calendar dob = Calendar.getInstance(); - dob.set(1979, Calendar.MAY, 27, 7, 32, 0); - dob.set(Calendar.MILLISECOND, 0); - dob.setTimeZone(TimeZone.getTimeZone("UTC")); - assertEquals(dob.getTime(), owner.getDate("dob")); - - Toml database = toml.getTable("database"); - assertEquals("192.168.1.1", database.getString("server")); - assertEquals(5000L, database.getLong("connection_max").longValue()); - assertTrue(database.getBoolean("enabled")); - assertEquals(Arrays.asList(8001L, 8001L, 8002L), database.getList("ports")); - - Toml servers = toml.getTable("servers"); - Toml alphaServers = servers.getTable("alpha"); - assertEquals("10.0.0.1", alphaServers.getString("ip")); - assertEquals("eqdc10", alphaServers.getString("dc")); - Toml betaServers = servers.getTable("beta"); - assertEquals("10.0.0.2", betaServers.getString("ip")); - assertEquals("eqdc10", betaServers.getString("dc")); - assertEquals("中国", betaServers.getString("country")); - - Toml clients = toml.getTable("clients"); - assertEquals(asList(asList("gamma", "delta"), asList(1L, 2L)), clients.getList("data")); - assertEquals(asList("alpha", "omega"), clients.getList("hosts")); - } - - @Test - public void should_parse_hard_example() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("hard_example.toml").getFile())); - - assertEquals("You'll hate me after this - #", toml.getString("the.test_string")); - assertEquals(asList("] ", " # "), toml.getList("the.hard.test_array")); - assertEquals(asList("Test #11 ]proved that", "Experiment #9 was a success"), toml.getList("the.hard.test_array2")); - assertEquals(" Same thing, but with a string #", toml.getString("the.hard.another_test_string")); - assertEquals(" And when \"'s are in the string, along with # \"", toml.getString("the.hard.harder_test_string")); - Toml theHardBit = toml.getTable("the.hard.\"bit#\""); - assertEquals("You don't think some user won't do that?", theHardBit.getString("\"what?\"")); - assertEquals(asList("]"), theHardBit.getList("multi_line_array")); - } - - @SuppressWarnings("unchecked") - @Test - public void should_parse_current_version_example() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("example-v0.4.0.toml").getFile())); - - assertEquals("value", toml.getString("table.key")); - assertEquals("another value", toml.getString("table.subtable.key")); - assertNotNull(toml.getTable("x.y.z").getTable("w")); - assertEquals("Tom", toml.getString("table.inline.name.first")); - assertEquals("Preston-Werner", toml.getString("table.inline.name.last")); - assertEquals(1, toml.getLong("table.inline.point.x").intValue()); - assertEquals(2, toml.getLong("table.inline.point.y").intValue()); -// assertEquals("pug", toml.getString("dog.tater.type")); - assertEquals("I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF.", toml.getString("string.basic.basic")); - assertEquals("One\nTwo", toml.getString("string.multiline.key3")); - assertEquals(toml.getString("string.multiline.key3"), toml.getString("string.multiline.key1")); - assertEquals(toml.getString("string.multiline.key3"), toml.getString("string.multiline.key2")); - assertEquals("The quick brown fox jumps over the lazy dog.", toml.getString("string.multiline.continued.key1")); - assertEquals("The quick brown fox jumps over the lazy dog.", toml.getString("string.multiline.continued.key2")); - assertEquals(toml.getString("string.multilined.singleline.key3"), toml.getString("string.multilined.singleline.key1")); - assertEquals(toml.getString("string.multilined.singleline.key3"), toml.getString("string.multilined.singleline.key2")); - assertEquals("C:\\Users\\nodejs\\templates", toml.getString("string.literal.winpath")); - assertEquals("\\\\ServerX\\admin$\\system32\\", toml.getString("string.literal.winpath2")); - assertEquals("Tom \"Dubs\" Preston-Werner", toml.getString("string.literal.quoted")); - assertEquals("<\\i\\c*\\s*>", toml.getString("string.literal.regex")); - assertEquals("I [dw]on't need \\d{2} apples", toml.getString("string.literal.multiline.regex2")); - assertEquals("The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n", toml.getString("string.literal.multiline.lines")); - assertEquals(99, toml.getLong("integer.key1").intValue()); - assertEquals(42, toml.getLong("integer.key2").intValue()); - assertEquals(0, toml.getLong("integer.key3").intValue()); - assertEquals(-17, toml.getLong("integer.key4").intValue()); - assertEquals(1000, toml.getLong("integer.underscores.key1").intValue()); - assertEquals(5349221, toml.getLong("integer.underscores.key2").longValue()); - assertEquals(12345, toml.getLong("integer.underscores.key3").intValue()); - assertEquals(1.0, toml.getDouble("float.fractional.key1").doubleValue(), 0); - assertEquals(3.1415, toml.getDouble("float.fractional.key2").doubleValue(), 0); - assertEquals(-0.01, toml.getDouble("float.fractional.key3").doubleValue(), 0); - assertEquals(5e+22, toml.getDouble("float.exponent.key1").doubleValue(), 0); - assertEquals(1e6, toml.getDouble("float.exponent.key2").longValue(), 0); - assertEquals(-2E-2, toml.getDouble("float.exponent.key3").doubleValue(), 0); - assertEquals(6.626e-34, toml.getDouble("float.both.key").doubleValue(), 0); - assertTrue(toml.getBoolean("boolean.True")); - assertFalse(toml.getBoolean("boolean.False")); - assertThat(toml.getList("array.key1"), contains(1L, 2L, 3L)); - assertThat(toml.getList("array.key2"), contains("red", "yellow", "green")); - assertEquals(asList(asList(1L, 2L), asList(3L, 4L, 5L)), toml.>getList("array.key3")); - assertEquals(asList(asList(1L, 2L), asList("a", "b", "c")), toml.>getList("array.key4")); - assertThat(toml.getList("array.key5"), contains(1L, 2L, 3L)); - assertThat(toml.getList("array.key6"), contains(1L, 2L)); - assertEquals("Hammer", toml.getString("products[0].name")); - assertEquals(738594937, toml.getLong("products[0].sku").intValue()); - assertNotNull(toml.getTable("products[1]")); - assertEquals("Nail", toml.getString("products[2].name")); - assertEquals(284758393, toml.getLong("products[2].sku").intValue()); - assertEquals("gray", toml.getString("products[2].color")); - assertEquals("apple", toml.getString("fruit[0].name")); - assertEquals("red", toml.getString("fruit[0].physical.color")); - assertEquals("round", toml.getString("fruit[0].physical.shape")); - assertEquals("red delicious", toml.getString("fruit[0].variety[0].name")); - assertEquals("granny smith", toml.getString("fruit[0].variety[1].name")); - assertEquals("banana", toml.getString("fruit[1].name")); - assertEquals("plantain", toml.getString("fruit[1].variety[0].name")); - - Calendar dob = Calendar.getInstance(); - dob.set(1979, Calendar.MAY, 27, 7, 32, 0); - dob.set(Calendar.MILLISECOND, 0); - dob.setTimeZone(TimeZone.getTimeZone("UTC")); - assertEquals(dob.getTime(), toml.getDate("datetime.key1")); - assertEquals(dob.getTime(), toml.getDate("datetime.key2")); - dob.set(Calendar.MILLISECOND, 999); - assertEquals(dob.getTime(), toml.getDate("datetime.key3")); - } - - @Test - public void should_allow_keys_with_same_name_in_different_tables() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("should_allow_keys_with_same_name_in_different_tables.toml").getFile())); - - assertTrue(toml.getTable("siteInfo.local.sh").getBoolean("enable")); - assertFalse(toml.getTable("siteInfo.localMobile.sh").getBoolean("enable")); - } -} diff --git a/src/test/java/com/moandjiezana/toml/StringTest.java b/src/test/java/com/moandjiezana/toml/StringTest.java deleted file mode 100644 index c0bb352..0000000 --- a/src/test/java/com/moandjiezana/toml/StringTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.File; - -import org.junit.Test; - -import com.moandjiezana.toml.testutils.Utils; - -public class StringTest { - - @Test - public void should_get_string() throws Exception { - Toml toml = new Toml().read("a = \"a\""); - - assertEquals("a", toml.getString("a")); - } - - @Test - public void should_get_empty_string() { - Toml toml = new Toml().read("a = \"\""); - assertEquals("", toml.getString("a")); - } - - @Test - public void should_get_empty_string_with_trailing_new_line() { - Toml toml = new Toml().read("a = \"\"\n"); - assertEquals("", toml.getString("a")); - } - - @Test - public void should_get_basic_multiline_string() throws Exception { - Toml toml = new Toml().read(file("should_get_basic_multiline_string")); - - assertEquals(toml.getString("ref"), toml.getString("one_line")); - assertEquals(toml.getString("ref"), toml.getString("many_lines")); - } - - @Test - public void should_get_multiline_string_without_new_lines() throws Exception { - Toml toml = new Toml().read(file("should_get_multiline_string_without_new_lines")); - - assertEquals(toml.getString("ref"), toml.getString("multi1")); - assertEquals(toml.getString("ref"), toml.getString("multi2")); - } - - @Test - public void should_get_literal_string() throws Exception { - Toml toml = new Toml().read(file("should_get_literal_string")); - - assertEquals("C:\\Users\\nodejs\\templates", toml.getString("winpath")); - assertEquals("\\\\ServerX\\admin$\\system32\\", toml.getString("winpath2")); - assertEquals("Tom \"Dubs\" Preston-Werner", toml.getString("quoted")); - assertEquals("<\\i\\c*\\s*>", toml.getString("regex")); - } - - @Test - public void should_get_multiline_literal_string() throws Exception { - Toml toml = new Toml().read(file("should_get_multiline_literal_string")); - - assertTrue(toml.getString("empty_line").isEmpty()); - assertEquals(toml.getString("regex2_ref"), toml.getString("regex2")); - assertEquals(toml.getString("lines_ref"), toml.getString("lines")); - } - - @Test - public void should_support_special_characters_in_strings() { - Toml toml = new Toml().read(new File(getClass().getResource("should_support_special_characters_in_strings.toml").getFile())); - - assertEquals("\" \t \n \r \\ \b \f", toml.getString("key")); - } - - @Test - public void should_support_unicode_characters_in_strings() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("should_support_special_characters_in_strings.toml").getFile())); - - assertEquals("more or less ±", toml.getString("unicode_key")); - assertEquals("more or less ±", toml.getString("unicode_key_uppercase")); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_reserved_special_character_in_strings() throws Exception { - new Toml().read("key=\"\\m\""); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_escaped_slash() throws Exception { - new Toml().read("key=\"\\/\""); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_text_after_literal_string() { - new Toml().read("a = ' ' jdkf"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_unterminated_literal_string() throws Exception { - new Toml().read("a = 'some text"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_multiline_literal_string_with_malformed_comment() throws Exception { - new Toml().read("a = '''some\n text\n''\nb = '''1'''"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_unterminated_multiline_literal_string() throws Exception { - new Toml().read("a = '''some\n text\n''"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_unterminated_multiline_literal_string_on_single_line() throws Exception { - new Toml().read("a = '''some text''"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_text_outside_multiline_string() { - new Toml().read("a = \"\"\" \"\"\" jdkf"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_unterminated_multiline_string() throws Exception { - new Toml().read("a = \"\"\"some text\"\""); - } - - private File file(String file) { - return Utils.file(getClass(), file); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TableArrayTest.java b/src/test/java/com/moandjiezana/toml/TableArrayTest.java deleted file mode 100644 index dd2d42c..0000000 --- a/src/test/java/com/moandjiezana/toml/TableArrayTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -import java.io.File; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - -public class TableArrayTest { - - @Test - public void should_parse_table_array() throws Exception { - Toml toml = new Toml().read(file("products_table_array")); - - List products = toml.getTables("products"); - - assertEquals(3, products.size()); - - assertEquals("Hammer", products.get(0).getString("name")); - assertEquals(738594937L, products.get(0).getLong("sku").longValue()); - - Assert.assertNull(products.get(1).getString("name")); - assertNull(products.get(1).getLong("sku")); - - assertEquals("Nail", products.get(2).getString("name")); - assertEquals(284758393L, products.get(2).getLong("sku").longValue()); - assertEquals("gray", products.get(2).getString("color")); - } - - @Test - public void should_parse_table_array_out_of_order() throws Exception { - Toml toml = new Toml().read(file("should_parse_table_array_out_of_order")); - - List tables = toml.getTables("product"); - List employees = toml.getTables("employee"); - - assertThat(tables, hasSize(2)); - assertThat(tables.get(0).getDouble("price"), equalTo(9.99)); - assertThat(tables.get(1).getString("type"), equalTo("ZX80")); - assertThat(employees, hasSize(1)); - assertThat(employees.get(0).getString("name"), equalTo("Marinus van der Lubbe")); - } - - @Test - public void should_parse_nested_table_arrays() throws Exception { - Toml toml = new Toml().read(file("fruit_table_array")); - - List fruits = toml.getTables("fruit"); - - assertEquals(2, fruits.size()); - - Toml apple = fruits.get(0); - assertEquals("apple", apple.getString("name")); - assertEquals("red", apple.getTable("physical").getString("color")); - assertEquals("round", apple.getTable("physical").getString("shape")); - assertEquals(2, apple.getTables("variety").size()); - - Toml banana = fruits.get(1); - assertEquals("banana", banana.getString("name")); - assertEquals(1, banana.getTables("variety").size()); - assertEquals("plantain", banana.getTables("variety").get(0).getString("name")); - } - - @Test - public void should_create_array_ancestors_as_tables() throws Exception { - Toml toml = new Toml().read("[[a.b.c]]\n id=3"); - - assertEquals(3, toml.getTable("a").getTable("b").getTables("c").get(0).getLong("id").intValue()); - } - - @Test - public void should_navigate_array_with_compound_key() throws Exception { - Toml toml = new Toml().read(file("fruit_table_array")); - - List appleVarieties = toml.getTables("fruit[0].variety"); - Toml appleVariety = toml.getTable("fruit[0].variety[1]"); - String bananaVariety = toml.getString("fruit[1].variety[0].name"); - - assertEquals(2, appleVarieties.size()); - assertEquals("red delicious", appleVarieties.get(0).getString("name")); - assertEquals("granny smith", appleVariety.getString("name")); - assertEquals("plantain", bananaVariety); - } - - @Test - public void should_return_null_for_missing_table_array() throws Exception { - Toml toml = new Toml().read("[a]"); - - assertNull(toml.getTables("b")); - } - - @Test - public void should_return_null_for_missing_table_array_with_index() throws Exception { - Toml toml = new Toml(); - - assertNull(toml.getTable("a[0]")); - assertNull(toml.getString("a[0].c")); - } - - @Test - public void should_return_null_for_index_out_of_bounds() throws Exception { - Toml toml = new Toml().read("[[a]]\n c = 1"); - - assertNull(toml.getTable("a[1]")); - } - - @Test - public void should_handle_repeated_tables() { - new Toml().read("[[a]]\n [a.b]\n [[a]]\n [a.b]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_empty_table_array_name() { - new Toml().read("[[]]"); - } - - private File file(String fileName) { - return new File(getClass().getResource(fileName + ".toml").getFile()); - } - -} diff --git a/src/test/java/com/moandjiezana/toml/TableTest.java b/src/test/java/com/moandjiezana/toml/TableTest.java deleted file mode 100644 index e17b441..0000000 --- a/src/test/java/com/moandjiezana/toml/TableTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -public class TableTest { - - @Test - public void should_get_table() throws Exception { - Toml toml = new Toml().read("[group]\nkey = \"value\""); - - Toml group = toml.getTable("group"); - - assertEquals("value", group.getString("key")); - } - - @Test - public void should_get_value_for_multi_key() throws Exception { - Toml toml = new Toml().read("[group]\nkey = \"value\""); - - assertEquals("value", toml.getString("group.key")); - } - - @Test - public void should_get_value_for_multi_key_with_no_parent_table() throws Exception { - Toml toml = new Toml().read("[group.sub]\nkey = \"value\""); - - assertEquals("value", toml.getString("group.sub.key")); - } - - @Test - public void should_get_table_for_multi_key() throws Exception { - Toml toml = new Toml().read("[group]\nother=1\n[group.sub]\nkey = \"value\""); - - assertEquals("value", toml.getTable("group.sub").getString("key")); - } - - @Test - public void should_get_table_for_multi_key_with_no_parent_table() throws Exception { - Toml toml = new Toml().read("[group.sub]\nkey = \"value\""); - - assertEquals("value", toml.getTable("group.sub").getString("key")); - } - - @Test - public void should_get_value_from_table_with_sub_table() throws Exception { - Toml toml = new Toml().read("[a.b]\nc=1\n[a]\nd=2"); - - assertEquals(2, toml.getLong("a.d").intValue()); - assertEquals(1, toml.getTable("a.b").getLong("c").intValue()); - } - - @Test - public void should_get_empty_table() throws Exception { - Toml toml = new Toml().read("[a]"); - assertTrue(toml.getTable("a").isEmpty()); - } - - @Test - public void should_return_null_for_missing_table() throws Exception { - assertNull(new Toml().getTable("a")); - } - - @Test - public void should_accept_table_name_with_basic_string() { - Toml toml = new Toml().read("[\"a\"]\nb = 'b'"); - - assertEquals("b", toml.getString("\"a\".b")); - } - - @Test - public void should_accept_table_name_part_with_basic_string() { - Toml toml = new Toml().read("[target.\"cfg(unix)\".dependencies]\nb = 'b'"); - - assertEquals("b", toml.getString("target.\"cfg(unix)\".dependencies.b")); - } - - @Test - public void should_accept_table_name_part_with_whitespace_and_basic_string() { - Toml toml = new Toml().read("[ target . \"cfg (unix)\" . dependencies ]\nb = 'b'"); - - assertEquals("b", toml.getString("target.\"cfg (unix)\".dependencies.b")); - } - - @Test - public void should_accept_table_name_with_literal_string() { - Toml toml = new Toml().read("['a']\nb = 'b'"); - - assertEquals("b", toml.getString("'a'.b")); - } - - @Test - public void should_accept_table_name_part_with_literal_string() { - Toml toml = new Toml().read("[target.'cfg(unix)'.dependencies]\nb = 'b'"); - - assertEquals("b", toml.getString("target.'cfg(unix)'.dependencies.b")); - } - - @Test - public void should_accept_table_name_part_with_whitespace_and_literal_string() { - Toml toml = new Toml().read("[target . 'cfg(unix)' . dependencies]\nb = 'b'"); - - assertEquals("b", toml.getString("target.'cfg(unix)'.dependencies.b")); - } - - @Test - public void should_return_null_when_navigating_to_missing_value() throws Exception { - Toml toml = new Toml(); - - assertNull(toml.getString("a.b")); - assertNull(toml.getList("a.b")); - assertNull(toml.getTable("a.b")); - } - - @Test - public void should_return_null_when_no_value_for_multi_key() throws Exception { - Toml toml = new Toml().read(""); - - assertNull(toml.getString("group.key")); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_table_defined_twice() throws Exception { - new Toml().read("[a]\nb=1\n[a]\nc=2"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_illegal_characters_after_table() throws Exception { - new Toml().read("[error] if you didn't catch this, your parser is broken"); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TomlDefaultsTest.java b/src/test/java/com/moandjiezana/toml/TomlDefaultsTest.java deleted file mode 100644 index ae615c1..0000000 --- a/src/test/java/com/moandjiezana/toml/TomlDefaultsTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; - -import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; - - -public class TomlDefaultsTest { - - private Toml defaultToml; - - @Before - public void before() { - defaultToml = new Toml().read("a = \"a\"\n [group]\n a=\"a\"\n [[array]]\n b=1\n [[array]]\n b=2"); - } - - @Test - public void should_fall_back_to_default_value() { - Toml toml = new Toml(defaultToml); - - assertEquals("a", toml.getString("a")); - } - - @Test - public void should_use_value_when_present_in_values_and_defaults() { - Toml toml = new Toml(defaultToml).read("a = \"b\""); - - assertEquals("b", toml.getString("a")); - } - - @Test - public void should_return_null_when_no_defaults_for_key() throws Exception { - Toml toml = new Toml(defaultToml).read(""); - - assertNull(toml.getString("b")); - } - - @Test - public void should_fall_back_to_default_with_multi_key() throws Exception { - Toml toml = new Toml(defaultToml).read(""); - - assertEquals("a", toml.getString("group.a")); - } - - @Test - public void should_fall_back_to_table() throws Exception { - Toml toml = new Toml(defaultToml).read(""); - - assertEquals("a", toml.getTable("group").getString("a")); - } - - @Test - public void should_fall_back_to_table_array() throws Exception { - Toml toml = new Toml(defaultToml).read(""); - - assertThat(toml.getTables("array"), hasSize(2)); - assertThat(toml.getLong("array[1].b"), Matchers.equalTo(2L)); - } - - @Test - public void should_perform_shallow_merge() throws Exception { - Toml toml = new Toml(defaultToml).read("[group]\nb=1\n [[array]]\n b=0"); - Toml toml2 = new Toml(defaultToml).read("[[array]]\n b=1\n [[array]]\n b=2\n [[array]]\n b=3"); - - assertEquals(1, toml.getTable("group").getLong("b").intValue()); - assertNull(toml.getTable("group").getString("a")); - assertThat(toml.getTables("array"), hasSize(1)); - assertEquals(0, toml.getLong("array[0].b").intValue()); - assertThat(toml2.getTables("array"), hasSize(3)); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TomlReadTest.java b/src/test/java/com/moandjiezana/toml/TomlReadTest.java deleted file mode 100644 index 5b63b73..0000000 --- a/src/test/java/com/moandjiezana/toml/TomlReadTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; - -import org.junit.Test; - -public class TomlReadTest { - - @Test - public void should_read_input_stream() throws Exception { - Toml toml = new Toml().read(getClass().getResourceAsStream("should_load_from_file.toml")); - - assertEquals("value", toml.getString("key")); - } - - @Test - public void should_read_reader() throws Exception { - Toml toml = new Toml().read(new StringReader("key=1")); - - assertEquals(1, toml.getLong("key").intValue()); - } - - @Test - public void should_fail_on_missing_file() throws Exception { - try { - new Toml().read(new File("missing")); - fail("Exception should have been thrown"); - } catch (RuntimeException e) { - assertThat(e.getCause(), instanceOf(FileNotFoundException.class)); - } - } - - @Test - public void should_fail_on_io_error() throws Exception { - Reader readerThatThrows = new Reader() { - - @Override - public int read(char[] cbuf, int off, int len) throws IOException { - throw new IOException(); - } - - @Override - public void close() throws IOException {} - }; - - try { - new Toml().read(readerThatThrows); - fail("Exception should have been thrown"); - } catch (RuntimeException e) { - assertThat(e.getCause(), instanceOf(IOException.class)); - } - } - - @Test - public void should_read_toml_without_defaults() { - Toml toml1 = new Toml().read("a = 1"); - Toml toml2 = new Toml().read(toml1); - - assertEquals(toml1.getLong("a"), toml2.getLong("a")); - } - - @Test - public void should_read_toml_and_merge_with_defaults() { - Toml toml1 = new Toml().read("a = 1\nc = 3\nd = 5"); - Toml toml2 = new Toml().read("b = 2\nc = 4"); - Toml mergedToml = new Toml(toml1).read(toml2); - - assertEquals(toml1.getLong("a"), mergedToml.getLong("a")); - assertEquals(toml2.getLong("b"), mergedToml.getLong("b")); - assertEquals(toml2.getLong("c"), mergedToml.getLong("c")); - assertEquals(toml1.getLong("d"), mergedToml.getLong("d")); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TomlTest.java b/src/test/java/com/moandjiezana/toml/TomlTest.java deleted file mode 100644 index a6e1079..0000000 --- a/src/test/java/com/moandjiezana/toml/TomlTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.util.Calendar; -import java.util.TimeZone; - -import org.hamcrest.Matchers; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -public class TomlTest { - - @Rule - public final ExpectedException expectedException = ExpectedException.none(); - - @Test - public void should_return_null_if_no_value_for_key() throws Exception { - Toml toml = new Toml().read(""); - - assertNull(toml.getString("a")); - } - - @Test - public void should_load_from_file() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("should_load_from_file.toml").getFile())); - - assertEquals("value", toml.getString("key")); - } - - @Test - public void should_support_blank_lines() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("should_support_blank_line.toml").getFile())); - - assertEquals(1, toml.getLong("group.key").intValue()); - } - - @Test - public void should_allow_comment_after_values() throws Exception { - Toml toml = new Toml().read(new File(getClass().getResource("should_allow_comment_after_values.toml").getFile())); - - assertEquals(1, toml.getLong("a").intValue()); - assertEquals(1.1, toml.getDouble("b").doubleValue(), 0); - assertEquals("abc", toml.getString("c")); - Calendar cal = Calendar.getInstance(); - cal.set(2014, Calendar.AUGUST, 4, 13, 47, 0); - cal.set(Calendar.MILLISECOND, 0); - cal.setTimeZone(TimeZone.getTimeZone("UTC")); - assertEquals(cal.getTime(), toml.getDate("d")); - assertThat(toml.getList("e"), Matchers.contains("a", "b")); - assertTrue(toml.getBoolean("f")); - assertEquals("abc", toml.getString("g")); - assertEquals("abc", toml.getString("h")); - assertEquals("abc\nabc", toml.getString("i")); - assertEquals("abc\nabc", toml.getString("j")); - } - - @Test - public void should_be_empty_if_no_values() throws Exception { - assertTrue(new Toml().isEmpty()); - assertFalse(new Toml().read("a = 1").isEmpty()); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_empty_key_name() throws Exception { - new Toml().read(" = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_key_name_with_hash() throws Exception { - new Toml().read("a# = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_on_key_name_starting_with_square_bracket() throws Exception { - new Toml().read("[a = 1"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_key_is_overwritten_by_table() { - new Toml().read("[a]\nb=1\n[a.b]\nc=2"); - } - - @Test - public void should_fail_when_key_in_root_is_overwritten_by_table() throws Exception { - expectedException.expect(IllegalStateException.class); - new Toml().read("a=1\n [a]"); - } - - @Test(expected = IllegalStateException.class) - public void should_fail_when_key_is_overwritten_by_another_key() { - new Toml().read("[fruit]\ntype=\"apple\"\ntype=\"orange\""); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TomlToClassTest.java b/src/test/java/com/moandjiezana/toml/TomlToClassTest.java deleted file mode 100644 index 7b99fea..0000000 --- a/src/test/java/com/moandjiezana/toml/TomlToClassTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.moandjiezana.toml; - -import static org.hamcrest.Matchers.arrayContaining; -import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -import java.io.File; -import java.lang.annotation.ElementType; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.net.URL; -import java.util.Calendar; -import java.util.TimeZone; - -import org.junit.Test; - -import com.moandjiezana.toml.testutils.ExtraPrimitives; -import com.moandjiezana.toml.testutils.FruitArray; -import com.moandjiezana.toml.testutils.FruitArray.Fruit; -import com.moandjiezana.toml.testutils.TomlPrimitives; -import com.moandjiezana.toml.testutils.TomlTableArrays; -import com.moandjiezana.toml.testutils.TomlTables; - -public class TomlToClassTest { - - @Test - public void should_convert_toml_primitives() throws Exception { - Toml toml = new Toml().read(file("should_convert_primitive_values.toml")); - - TomlPrimitives values = toml.to(TomlPrimitives.class); - - Calendar calendar = Calendar.getInstance(); - calendar.set(1979, Calendar.MAY, 27, 7, 32, 00); - calendar.set(Calendar.MILLISECOND, 0); - calendar.setTimeZone(TimeZone.getTimeZone("UTC")); - - assertEquals("string", values.string); - assertEquals((Long) 123L, values.number); - assertEquals(2.1, values.decimal, 0); - assertTrue(values.bool); - assertEquals(calendar.getTime(), values.date); - } - - @Test - public void should_convert_to_non_toml_primitives() throws Exception { - ExtraPrimitives extraPrimitives = new Toml().read(file("should_convert_extra_primitives.toml")).to(ExtraPrimitives.class); - - assertEquals("Did not convert table to map", "value", extraPrimitives.group.get("key")); - assertEquals("Did not convert double to BigDecimal", BigDecimal.valueOf(1.2), extraPrimitives.bigDecimal); - assertEquals("Did not convert integer to BigInteger", BigInteger.valueOf(5), extraPrimitives.bigInteger); - assertEquals("Did not convert integer to short", Short.parseShort("3"), extraPrimitives.aShort); - assertEquals("Did not convert integer to Integer", Integer.valueOf(7), extraPrimitives.anInteger); - assertEquals("Did not convert string to Character", Character.valueOf('u'), extraPrimitives.character); - assertEquals("Did not convert string to URL", new URL("http://www.example.com").toString(), extraPrimitives.url.toString()); - assertEquals("Did not convert string to URI", new URI("http://www.test.com").toString(), extraPrimitives.uri.toString()); - assertThat(extraPrimitives.set, contains("a", "b")); - assertThat(extraPrimitives.strings, arrayContaining("c", "d")); - assertEquals("Did not convert string to enum", ElementType.CONSTRUCTOR, extraPrimitives.elementType); - } - - @Test - public void should_convert_tables() throws Exception { - String fileName = "should_convert_tables.toml"; - Toml toml = new Toml().read(file(fileName)); - - TomlTables tomlTables = toml.to(TomlTables.class); - - assertEquals("value1", tomlTables.group1.string); - assertEquals("value2", tomlTables.group2.string); - } - - @Test - public void should_convert_tables_with_defaults() throws Exception { - Toml defaultToml = new Toml().read("[group2]\n string=\"defaultValue2\"\n number=2\n [group3]\n string=\"defaultValue3\""); - Toml toml = new Toml(defaultToml).read(file("should_convert_tables.toml")); - - TomlTables tomlTables = toml.to(TomlTables.class); - - assertEquals("value1", tomlTables.group1.string); - assertEquals("value2", tomlTables.group2.string); - assertNull(tomlTables.group2.number); - assertEquals("defaultValue3", tomlTables.group3.string); - } - - @Test - public void should_use_defaults() throws Exception { - Toml defaults = new Toml().read(file("should_convert_tables.toml")); - Toml toml = new Toml(defaults).read(""); - - TomlTables tomlTables = toml.to(TomlTables.class); - - assertEquals("value1", tomlTables.group1.string); - assertEquals("value2", tomlTables.group2.string); - } - - @Test - public void should_ignore_keys_not_in_class() throws Exception { - TomlPrimitives tomlPrimitives = new Toml().read("a=1\nstring=\"s\"").to(TomlPrimitives.class); - - assertEquals("s", tomlPrimitives.string); - } - - @Test - public void should_convert_table_array() throws Exception { - TomlTableArrays toml = new Toml().read(file("should_convert_table_array_to_class.toml")).to(TomlTableArrays.class); - - assertEquals(2, toml.groupers.size()); - assertEquals("grouper 1", toml.groupers.get(0).string); - assertEquals("grouper 2", toml.groupers.get(1).string); - - assertEquals("My Name", toml.name); - assertEquals(12, toml.primitives.number.intValue()); - } - - @Test - public void should_convert_fruit_table_array() throws Exception { - FruitArray fruitArray = new Toml().read(file("fruit_table_array.toml")).to(FruitArray.class); - - assertEquals(2, fruitArray.fruit.size()); - Fruit apple = fruitArray.fruit.get(0); - assertEquals("apple", apple.name); - assertEquals("red", apple.physical.color); - assertEquals("round", apple.physical.shape); - assertEquals(2, apple.variety.size()); - assertEquals("red delicious", apple.variety.get(0).get("name")); - assertEquals("granny smith", apple.variety.get(1).get("name")); - - Fruit banana = fruitArray.fruit.get(1); - assertEquals("banana", banana.name); - assertEquals(1, banana.variety.size()); - assertEquals("plantain", banana.variety.get(0).get("name")); - } - - private File file(String fileName) { - return new File(getClass().getResource(fileName).getFile()); - } -} diff --git a/src/test/java/com/moandjiezana/toml/TomlWriterTest.java b/src/test/java/com/moandjiezana/toml/TomlWriterTest.java deleted file mode 100644 index 89f1a4f..0000000 --- a/src/test/java/com/moandjiezana/toml/TomlWriterTest.java +++ /dev/null @@ -1,575 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.*; - -import java.io.BufferedReader; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.lang.annotation.RetentionPolicy; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.TimeZone; - -import org.hamcrest.Matchers; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.rules.TemporaryFolder; - -@SuppressWarnings("unused") -public class TomlWriterTest { - - @Rule - public TemporaryFolder testDirectory = new TemporaryFolder(); - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @Test - public void should_write_primitive_types() { - class TestClass { - public String aString = "hello"; - int anInt = 4; - protected float aFloat = 1.23f; - private double aDouble = -5.43; - final boolean aBoolean = false; - static final int aFinalInt = 1; // Should be skipped - Date aDate; - } - - TestClass o = new TestClass(); - - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Africa/Johannesburg")); - calendar.set(2015, Calendar.JULY, 1, 11, 5, 30); - calendar.set(Calendar.MILLISECOND, 0); - o.aDate = calendar.getTime(); - - String output = new TomlWriter().write(o); - String expected = "aString = \"hello\"\n" + - "anInt = 4\n" + - "aFloat = 1.23\n" + - "aDouble = -5.43\n" + - "aBoolean = false\n" + - "aDate = 2015-07-01T09:05:30Z\n"; - - assertEquals(expected, output); - } - - class SubChild { - int anInt; - } - class Child { - SubChild subChild; - int anInt; - } - class Parent { - Map aMap; - Child child; - boolean aBoolean; - } - - private Parent buildNestedMap() { - Parent parent = new Parent(); - parent.aMap = new LinkedHashMap(); - parent.aMap.put("foo", 1); - parent.aMap.put("bar", "value1"); - parent.aMap.put("baz.x", true); - parent.child = new Child(); - parent.child.anInt = 2; - parent.child.subChild = new SubChild(); - parent.child.subChild.anInt = 4; - parent.aBoolean = true; - - return parent; - } - - @Test - public void should_write_nested_map_with_default_indentation_policy() { - String output = new TomlWriter().write(buildNestedMap()); - String expected = "aBoolean = true\n\n" + - "[aMap]\n" + - "foo = 1\n" + - "bar = \"value1\"\n" + - "\"baz.x\" = true\n\n" + - "[child]\n" + - "anInt = 2\n\n" + - "[child.subChild]\n" + - "anInt = 4\n"; - assertEquals(expected, output); - } - - @Test - public void should_follow_indentation_policy_of_indented_values() { - String output = new TomlWriter.Builder(). - indentValuesBy(2). - build(). - write(buildNestedMap()); - String expected = "aBoolean = true\n\n" + - "[aMap]\n" + - " foo = 1\n" + - " bar = \"value1\"\n" + - " \"baz.x\" = true\n\n" + - "[child]\n" + - " anInt = 2\n\n" + - "[child.subChild]\n" + - " anInt = 4\n"; - assertEquals(expected, output); - } - - @Test - public void should_follow_indentation_policy_of_indented_tables() { - String output = new TomlWriter.Builder(). - indentTablesBy(2). - build(). - write(buildNestedMap()); - String expected = "aBoolean = true\n\n" + - "[aMap]\n" + - "foo = 1\n" + - "bar = \"value1\"\n" + - "\"baz.x\" = true\n\n" + - "[child]\n" + - "anInt = 2\n\n" + - " [child.subChild]\n" + - " anInt = 4\n"; - assertEquals(expected, output); - } - - @Test - public void should_follow_indentation_policy_of_indented_tables_and_values() { - String output = new TomlWriter.Builder(). - indentValuesBy(2). - indentTablesBy(2). - build(). - write(buildNestedMap()); - String expected = "aBoolean = true\n\n" + - "[aMap]\n" + - " foo = 1\n" + - " bar = \"value1\"\n" + - " \"baz.x\" = true\n\n" + - "[child]\n" + - " anInt = 2\n\n" + - " [child.subChild]\n" + - " anInt = 4\n"; - assertEquals(expected, output); - } - - @Test - public void should_write_array_of_tables_from_object() { - class Table { - int anInt; - - Table(int anInt) { - this.anInt = anInt; - } - } - class Config { - Table[] table = new Table[]{new Table(1), new Table(2)}; - List
table2 = Arrays.asList(new Table(3), new Table(4)); - } - Config config = new Config(); - - String output = new TomlWriter().write(config); - String expected = "[[table]]\n" + - "anInt = 1\n\n" + - "[[table]]\n" + - "anInt = 2\n" + - "[[table2]]\n" + - "anInt = 3\n\n" + - "[[table2]]\n" + - "anInt = 4\n"; - assertEquals(expected, output); - } - - @Test - public void should_write_array_of_tables_from_map() throws Exception { - List> maps = new ArrayList>(); - - HashMap item1 = new HashMap(); - item1.put("anInt", 1L); - HashMap item2 = new HashMap(); - item2.put("anInt", 2L); - - maps.add(item1); - maps.add(item2); - - Map input = new HashMap(); - input.put("maps", maps); - - String output = new TomlWriter().write(input); - - String expected = "[[maps]]\n" + - "anInt = 1\n\n" + - "[[maps]]\n" + - "anInt = 2\n"; - assertEquals(expected, output); - } - - @Test - public void should_write_array_of_array() { - class ArrayTest { - int[][] array = {{1, 2, 3}, {4, 5, 6}}; - } - ArrayTest arrayTest = new ArrayTest(); - - String output = new TomlWriter.Builder().padArrayDelimitersBy(1).build().write(arrayTest); - String expected = "array = [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]\n"; - assertEquals(expected, output); - } - - @Test - public void should_write_list() { - class ListTest { - List aList = new LinkedList(); - } - ListTest o = new ListTest(); - o.aList.add(1); - o.aList.add(2); - - assertEquals("aList = [ 1, 2 ]\n", new TomlWriter.Builder().padArrayDelimitersBy(1).build().write(o)); - } - - @Test - public void should_handle_zero_length_arrays_and_lists() { - class TestClass { - List aList = new LinkedList(); - Float[] anArray = new Float[0]; - } - assertEquals("aList = []\nanArray = []\n", new TomlWriter().write(new TestClass())); - } - - @Test - 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"; - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage(Matchers.startsWith("array")); - - new TomlWriter().write(badArray); - } - - @Test - public void should_reject_nested_heterogeneous_array() { - class BadArray { - Map aMap = new HashMap(); - } - - BadArray badArray = new BadArray(); - badArray.aMap.put("array", new Object[] { Integer.valueOf(1), "oops" }); - - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage("aMap.array"); - - new TomlWriter().write(badArray); - } - - @Test - public void should_elide_empty_intermediate_tables() { - class C { - int anInt = 1; - } - class B { - C c = new C(); - } - class A { - B b = new B(); - } - - assertEquals("[b.c]\nanInt = 1\n", new TomlWriter().write(new A())); - } - - @Test - public void should_write_map() throws Exception { - assertEquals("a = 1\n", new TomlWriter().write(new Toml().read("a = 1").toMap())); - } - - class Base { - protected int anInt = 2; - } - class Impl extends Base { - boolean aBoolean = true; - } - - @Test - public void should_write_classes_with_inheritance() { - Impl impl = new Impl(); - String expected = "aBoolean = true\nanInt = 2\n"; - assertEquals(expected, new TomlWriter().write(impl)); - } - - @Test - public void should_write_strings_to_toml_utf8() throws UnsupportedEncodingException { - class Utf8Test { - String input; - } - - Utf8Test utf8Test = new Utf8Test(); - utf8Test.input = " é foo \u20AC \b \t \n \f \r \" \\ "; - assertEquals("input = \" é foo € \\b \\t \\n \\f \\r \\\" \\\\ \"\n", new TomlWriter().write(utf8Test)); - - // Check unicode code points greater than 0XFFFF - utf8Test.input = " \uD801\uDC28 \uD840\uDC0B "; - assertEquals("input = \" 𐐨 𠀋 \"\n", new TomlWriter().write(utf8Test)); - } - - @Test - public void should_quote_keys() { - Map aMap = new LinkedHashMap(); - aMap.put("a.b", 1); - aMap.put("5€", 2); - aMap.put("c$d", 3); - aMap.put("e/f", 4); - - String expected = "\"a.b\" = 1\n" + - "\"5€\" = 2\n" + - "\"c$d\" = 3\n" + - "\"e/f\" = 4\n"; - assertEquals(expected, new TomlWriter().write(aMap)); - } - - @Test - public void should_quote_keys_in_object() throws Exception { - class A$ { - Double µµ = 5.3; - } - - class A { - int €5 = 5; - String français = "langue"; - A$ a$ = new A$(); - } - - assertEquals("\"€5\" = 5\n\"français\" = \"langue\"\n\n[\"a$\"]\n\"µµ\" = 5.3\n", new TomlWriter().write(new A())); - } - - @Test - public void should_handle_urls() throws Exception { - class WithUrl { - URL url; - URI uri; - } - - WithUrl from = new WithUrl(); - from.url = new URL("https://github.com"); - from.uri = new URI("https://bitbucket.com"); - - String expected = "url = \"https://github.com\"\n" - + "uri = \"https://bitbucket.com\"\n"; - - assertEquals(expected, new TomlWriter().write(from)); - } - - @Test - public void should_handle_enum() throws Exception { - class WithEnum { - RetentionPolicy retentionPolicy = RetentionPolicy.RUNTIME; - } - - assertEquals("retentionPolicy = \"RUNTIME\"\n", new TomlWriter().write(new WithEnum())); - } - - @Test - public void should_handle_char() throws Exception { - class WithChar { - char c = 'a'; - } - - assertEquals("c = \"a\"\n", new TomlWriter().write(new WithChar())); - } - - @Test - public void should_handle_big_numbers() throws Exception { - class WithBigNumbers { - BigInteger bigInt = BigInteger.valueOf(1); - BigDecimal bigDecimal = BigDecimal.valueOf(2.8); - } - - String expected = "bigInt = 1\n" - + "bigDecimal = 2.8\n"; - - assertEquals(expected, new TomlWriter().write(new WithBigNumbers())); - } - - @Test - public void should_handle_wrappers() throws Exception { - class WithWrappers { - Character c = Character.valueOf('b'); - Long l = Long.valueOf(2); - Double d = Double.valueOf(3.4); - } - - String expected = "c = \"b\"\n" - + "l = 2\n" - + "d = 3.4\n"; - - assertEquals(expected, new TomlWriter().write(new WithWrappers())); - } - - @Test - public void should_use_specified_time_zone() throws Exception { - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - calendar.set(2015, Calendar.JULY, 1, 11, 5, 30); - calendar.set(Calendar.MILLISECOND, 0); - - Map o = new HashMap(); - - o.put("sast", calendar.getTime()); - - TomlWriter writer = new TomlWriter.Builder(). - timeZone(TimeZone.getTimeZone("Africa/Johannesburg")). - build(); - - assertEquals("sast = 2015-07-01T13:05:30+02:00\n", writer.write(o)); - } - - @Test - public void should_show_fractional_seconds() throws Exception { - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - calendar.set(2015, Calendar.JULY, 1, 11, 5, 30); - calendar.set(Calendar.MILLISECOND, 345); - - Map o = new HashMap(); - - o.put("date", calendar.getTime()); - - TomlWriter writer = new TomlWriter.Builder(). - showFractionalSeconds(). - build(); - - assertEquals("date = 2015-07-01T11:05:30.345Z\n", writer.write(o)); - } - - @Test - public void should_show_fractional_seconds_in_specified_time_zone() throws Exception { - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - calendar.set(2015, Calendar.JULY, 1, 11, 5, 30); - calendar.set(Calendar.MILLISECOND, 345); - - Map o = new LinkedHashMap(); - - o.put("date", calendar.getTime()); - calendar.set(Calendar.MINUTE, 37); - o.put("date2", calendar.getTime()); - - TomlWriter writer = new TomlWriter.Builder(). - timeZone(TimeZone.getTimeZone("Africa/Johannesburg")). - showFractionalSeconds(). - build(); - - String expected = "date = 2015-07-01T13:05:30.345+02:00\n" - + "date2 = 2015-07-01T13:37:30.345+02:00\n"; - - assertEquals(expected, writer.write(o)); - } - - private static class SimpleTestClass { - int a = 1; - } - - private static class TransientClass { - int a = 2; - transient int b = 3; - } - - @Test - public void should_write_to_writer() throws IOException { - StringWriter output = new StringWriter(); - new TomlWriter().write(new SimpleTestClass(), output); - - assertEquals("a = 1\n", output.toString()); - } - - @Test - public void should_write_to_outputstream() throws IOException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - new TomlWriter().write(new SimpleTestClass(), output); - - assertEquals("a = 1\n", output.toString()); - } - - @Test - public void should_write_to_file() throws IOException { - File output = testDirectory.newFile(); - new TomlWriter().write(new SimpleTestClass(), output); - - assertEquals("a = 1\n", readFile(output)); - } - - @Test - public void should_skip_transient_fields() throws Exception { - String toml = new TomlWriter().write(new TransientClass()); - - assertEquals("a = 2\n", toml); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_string_fragment() { - new TomlWriter().write("fragment"); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_boolean_fragment() { - new TomlWriter().write(true); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_number_fragment() { - new TomlWriter().write(42); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_date_fragment() { - new TomlWriter().write(new Date()); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_array_fragment() { - new TomlWriter().write(new int[2]); - } - - @Test(expected = IllegalArgumentException.class) - public void should_refuse_to_write_table_array_fragment() { - new TomlWriter().write(new SimpleTestClass[2]); - } - - @Test(expected=IllegalArgumentException.class) - public void should_not_write_list() throws Exception { - new TomlWriter().write(Arrays.asList("a")); - } - - private String readFile(File input) throws IOException { - BufferedReader bufferedReader = new BufferedReader(new FileReader(input)); - - try { - StringBuilder w = new StringBuilder(); - String line = bufferedReader.readLine(); - while (line != null) { - w.append(line).append('\n'); - line = bufferedReader.readLine(); - } - - return w.toString(); - } finally { - bufferedReader.close(); - } - } -} diff --git a/src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java b/src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java deleted file mode 100644 index 84e6515..0000000 --- a/src/test/java/com/moandjiezana/toml/Toml_ToMapTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.moandjiezana.toml; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - -public class Toml_ToMapTest { - - @Test - public void should_convert_simple_values() { - Map toml = new Toml().read("a = 1").toMap(); - - Assert.assertEquals(Long.valueOf(1), toml.get("a")); - } - - @Test - @SuppressWarnings("unchecked") - public void should_covert_table() throws Exception { - Map toml = new Toml().read("c = 2\n [a]\n b = 1").toMap(); - - Assert.assertEquals(Long.valueOf(1), ((Map) toml.get("a")).get("b")); - Assert.assertEquals(Long.valueOf(2), toml.get("c")); - } -} diff --git a/src/test/java/com/moandjiezana/toml/UnicodeTest.java b/src/test/java/com/moandjiezana/toml/UnicodeTest.java deleted file mode 100644 index f3873c0..0000000 --- a/src/test/java/com/moandjiezana/toml/UnicodeTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.moandjiezana.toml; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -public class UnicodeTest { - - @Test - public void should_support_short_escape_form() throws Exception { - Toml toml = new Toml().read("key = \"Jos\u00E9\\nLocation\tSF\""); - - assertEquals("José\nLocation\tSF", toml.getString("key")); - } - - @Test - public void should_support_unicode_literal() throws Exception { - Toml toml = new Toml().read("key = \"José LöcÄtion SF\""); - - assertEquals("José LöcÄtion SF", toml.getString("key")); - } -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/ExtraPrimitives.java b/src/test/java/com/moandjiezana/toml/testutils/ExtraPrimitives.java deleted file mode 100644 index a962f21..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/ExtraPrimitives.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.moandjiezana.toml.testutils; - -import java.lang.annotation.ElementType; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.net.URL; -import java.util.Map; -import java.util.Set; - -public class ExtraPrimitives { - - public Map group; - public BigDecimal bigDecimal; - public BigInteger bigInteger; - public short aShort; - public Integer anInteger; - public Character character; - public ElementType elementType; - public URL url; - public URI uri; - public Set set; - public String[] strings; -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/FruitArray.java b/src/test/java/com/moandjiezana/toml/testutils/FruitArray.java deleted file mode 100644 index 8eba20e..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/FruitArray.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.moandjiezana.toml.testutils; - -import java.util.List; -import java.util.Map; - -public class FruitArray { - - public static class Fruit { - public String name; - public Physical physical; - public List> variety; - } - - public static class Physical { - public String color; - public String shape; - } - - public List fruit; -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/TomlPrimitives.java b/src/test/java/com/moandjiezana/toml/testutils/TomlPrimitives.java deleted file mode 100644 index 7500d34..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/TomlPrimitives.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moandjiezana.toml.testutils; - -import java.util.Date; - -public class TomlPrimitives { - - public String string; - public Long number; - public Double decimal; - public Boolean bool; - public Date date; - -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/TomlTableArrays.java b/src/test/java/com/moandjiezana/toml/testutils/TomlTableArrays.java deleted file mode 100644 index c4becb4..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/TomlTableArrays.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.moandjiezana.toml.testutils; - -import java.util.List; - -public class TomlTableArrays { - - public List groupers; - public String name; - public TomlPrimitives primitives; -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/TomlTables.java b/src/test/java/com/moandjiezana/toml/testutils/TomlTables.java deleted file mode 100644 index 7ab892f..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/TomlTables.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.moandjiezana.toml.testutils; - - -public class TomlTables { - - public TomlPrimitives group1; - public TomlPrimitives group2; - public TomlPrimitives group3; -} diff --git a/src/test/java/com/moandjiezana/toml/testutils/Utils.java b/src/test/java/com/moandjiezana/toml/testutils/Utils.java deleted file mode 100644 index 8b6da1f..0000000 --- a/src/test/java/com/moandjiezana/toml/testutils/Utils.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.moandjiezana.toml.testutils; - -import java.io.File; - -public class Utils { - - public static File file(Class aClass, String file) { - return new File(aClass.getResource(file + ".toml").getFile()); - } -} diff --git a/src/test/resources/IteratorTest/list.toml b/src/test/resources/IteratorTest/list.toml deleted file mode 100644 index fdcf4ec..0000000 --- a/src/test/resources/IteratorTest/list.toml +++ /dev/null @@ -1 +0,0 @@ -list = ["a", "b", "c"] diff --git a/src/test/resources/IteratorTest/long.toml b/src/test/resources/IteratorTest/long.toml deleted file mode 100644 index 3641e48..0000000 --- a/src/test/resources/IteratorTest/long.toml +++ /dev/null @@ -1 +0,0 @@ -long = 2 diff --git a/src/test/resources/IteratorTest/multiple.toml b/src/test/resources/IteratorTest/multiple.toml deleted file mode 100644 index 38af207..0000000 --- a/src/test/resources/IteratorTest/multiple.toml +++ /dev/null @@ -1,7 +0,0 @@ -a = "a" -b = [1, 2, 3] - -[c] - d = true - -[[e]] diff --git a/src/test/resources/IteratorTest/table.toml b/src/test/resources/IteratorTest/table.toml deleted file mode 100644 index 541ee71..0000000 --- a/src/test/resources/IteratorTest/table.toml +++ /dev/null @@ -1 +0,0 @@ -table = { a = "a" } diff --git a/src/test/resources/IteratorTest/table_array.toml b/src/test/resources/IteratorTest/table_array.toml deleted file mode 100644 index b14906e..0000000 --- a/src/test/resources/IteratorTest/table_array.toml +++ /dev/null @@ -1,3 +0,0 @@ -[[table_array]] - -[[table_array]] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-arrays-and-ints.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-arrays-and-ints.toml deleted file mode 100644 index 051ec73..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-arrays-and-ints.toml +++ /dev/null @@ -1 +0,0 @@ -arrays-and-ints = [1, ["Arrays are not integers."]] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-ints-and-floats.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-ints-and-floats.toml deleted file mode 100644 index a5aa9b7..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-ints-and-floats.toml +++ /dev/null @@ -1 +0,0 @@ -ints-and-floats = [1, 1.1] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-strings-and-ints.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-strings-and-ints.toml deleted file mode 100644 index f348308..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/array-mixed-types-strings-and-ints.toml +++ /dev/null @@ -1 +0,0 @@ -strings-and-ints = ["hi", 42] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-leads.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-leads.toml deleted file mode 100644 index 123f173..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-leads.toml +++ /dev/null @@ -1 +0,0 @@ -no-leads = 1987-7-05T17:45:00Z diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-secs.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-secs.toml deleted file mode 100644 index ba93900..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-secs.toml +++ /dev/null @@ -1 +0,0 @@ -no-secs = 1987-07-05T17:45Z diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-t.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-t.toml deleted file mode 100644 index 617e3c5..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-t.toml +++ /dev/null @@ -1 +0,0 @@ -no-t = 1987-07-0517:45:00Z diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-z.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-z.toml deleted file mode 100644 index cf66b1e..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-no-z.toml +++ /dev/null @@ -1 +0,0 @@ -no-z = 1987-07-05T17:45:00 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-with-milli.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-with-milli.toml deleted file mode 100644 index eef792f..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/datetime-malformed-with-milli.toml +++ /dev/null @@ -1 +0,0 @@ -with-milli = 1987-07-5T17:45:00.12Z diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-key-table.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-key-table.toml deleted file mode 100644 index cedf05f..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-key-table.toml +++ /dev/null @@ -1,5 +0,0 @@ -[fruit] -type = "apple" - -[fruit.type] -apple = "yes" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-keys.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-keys.toml deleted file mode 100644 index 9b5aee0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-keys.toml +++ /dev/null @@ -1,2 +0,0 @@ -dupe = false -dupe = true diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-tables.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-tables.toml deleted file mode 100644 index 8ddf49b..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/duplicate-tables.toml +++ /dev/null @@ -1,2 +0,0 @@ -[a] -[a] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-implicit-table.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-implicit-table.toml deleted file mode 100644 index 0cc36d0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-implicit-table.toml +++ /dev/null @@ -1 +0,0 @@ -[naughty..naughty] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-table.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-table.toml deleted file mode 100644 index fe51488..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/empty-table.toml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-leading-zero.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-leading-zero.toml deleted file mode 100644 index cab76bf..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-leading-zero.toml +++ /dev/null @@ -1,2 +0,0 @@ -answer = .12345 -neganswer = -.12345 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-trailing-digits.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-trailing-digits.toml deleted file mode 100644 index cbff2d0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/float-no-trailing-digits.toml +++ /dev/null @@ -1,2 +0,0 @@ -answer = 1. -neganswer = -1. diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-empty.toml deleted file mode 100644 index 09f998f..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-empty.toml +++ /dev/null @@ -1 +0,0 @@ - = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-hash.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-hash.toml deleted file mode 100644 index e321b1f..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-hash.toml +++ /dev/null @@ -1 +0,0 @@ -a# = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-newline.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-newline.toml deleted file mode 100644 index 707aad5..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-newline.toml +++ /dev/null @@ -1,2 +0,0 @@ -a -= 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-open-bracket.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-open-bracket.toml deleted file mode 100644 index f0aeb16..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-open-bracket.toml +++ /dev/null @@ -1 +0,0 @@ -[abc = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-single-open-bracket.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-single-open-bracket.toml deleted file mode 100644 index 8e2f0be..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-single-open-bracket.toml +++ /dev/null @@ -1 +0,0 @@ -[ \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-start-bracket.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-start-bracket.toml deleted file mode 100644 index e0597ae..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-start-bracket.toml +++ /dev/null @@ -1,3 +0,0 @@ -[a] -[xyz = 5 -[b] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-two-equals.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-two-equals.toml deleted file mode 100644 index 25a0378..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/key-two-equals.toml +++ /dev/null @@ -1 +0,0 @@ -key= = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-byte-escape.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-byte-escape.toml deleted file mode 100644 index 4c7be59..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-byte-escape.toml +++ /dev/null @@ -1 +0,0 @@ -naughty = "\xAg" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-escape.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-escape.toml deleted file mode 100644 index 60acb0c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-bad-escape.toml +++ /dev/null @@ -1 +0,0 @@ -invalid-escape = "This string has a bad \a escape character." diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-byte-escapes.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-byte-escapes.toml deleted file mode 100644 index e94452a..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-byte-escapes.toml +++ /dev/null @@ -1 +0,0 @@ -answer = "\x33" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-no-close.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-no-close.toml deleted file mode 100644 index 0c292fc..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/string-no-close.toml +++ /dev/null @@ -1 +0,0 @@ -no-ending-quote = "One time, at band camp diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-implicit.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-implicit.toml deleted file mode 100644 index 05f2507..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-implicit.toml +++ /dev/null @@ -1,14 +0,0 @@ -# This test is a bit tricky. It should fail because the first use of -# `[[albums.songs]]` without first declaring `albums` implies that `albums` -# must be a table. The alternative would be quite weird. Namely, it wouldn't -# comply with the TOML spec: "Each double-bracketed sub-table will belong to -# the most *recently* defined table element *above* it." -# -# This is in contrast to the *valid* test, table-array-implicit where -# `[[albums.songs]]` works by itself, so long as `[[albums]]` isn't declared -# later. (Although, `[albums]` could be.) -[[albums.songs]] -name = "Glory Days" - -[[albums]] -name = "Born in the USA" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-bracket.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-bracket.toml deleted file mode 100644 index 39c73b0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-bracket.toml +++ /dev/null @@ -1,2 +0,0 @@ -[[albums] -name = "Born to Run" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-empty.toml deleted file mode 100644 index a470ca3..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-array-malformed-empty.toml +++ /dev/null @@ -1,2 +0,0 @@ -[[]] -name = "Born to Run" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-empty.toml deleted file mode 100644 index fe51488..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-empty.toml +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-close.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-close.toml deleted file mode 100644 index c8b5a67..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-close.toml +++ /dev/null @@ -1,2 +0,0 @@ -[a]b] -zyx = 42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-open.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-open.toml deleted file mode 100644 index 246d7e9..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/table-nested-brackets-open.toml +++ /dev/null @@ -1,2 +0,0 @@ -[a[b] -zyx = 42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-array-entries.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-array-entries.toml deleted file mode 100644 index 1a72890..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-array-entries.toml +++ /dev/null @@ -1,4 +0,0 @@ -array = [ - "Is there life after an array separator?", No - "Entry" -] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-integer.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-integer.toml deleted file mode 100644 index 42de7af..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-integer.toml +++ /dev/null @@ -1 +0,0 @@ -answer = 42 the ultimate answer? diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-string.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-string.toml deleted file mode 100644 index c92a6f1..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-string.toml +++ /dev/null @@ -1 +0,0 @@ -string = "Is there life after strings?" No. diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-table.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-table.toml deleted file mode 100644 index 87da9db..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-after-table.toml +++ /dev/null @@ -1 +0,0 @@ -[error] this shouldn't be here diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-before-array-separator.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-before-array-separator.toml deleted file mode 100644 index 9b06a39..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-before-array-separator.toml +++ /dev/null @@ -1,4 +0,0 @@ -array = [ - "Is there life before an array separator?" No, - "Entry" -] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-in-array.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-in-array.toml deleted file mode 100644 index a6a6c42..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/invalid/text-in-array.toml +++ /dev/null @@ -1,5 +0,0 @@ -array = [ - "Entry 1", - I don't belong, - "Entry 2", -] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.json deleted file mode 100644 index 2fbf256..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "thevoid": { "type": "array", "value": [ - {"type": "array", "value": [ - {"type": "array", "value": [ - {"type": "array", "value": [ - {"type": "array", "value": []} - ]} - ]} - ]} - ]} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.toml deleted file mode 100644 index fa58dc6..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-empty.toml +++ /dev/null @@ -1 +0,0 @@ -thevoid = [[[[[]]]]] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.json deleted file mode 100644 index 1833d61..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ints": { - "type": "array", - "value": [ - {"type": "integer", "value": "1"}, - {"type": "integer", "value": "2"}, - {"type": "integer", "value": "3"} - ] - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.toml deleted file mode 100644 index 6618936..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/array-nospaces.toml +++ /dev/null @@ -1 +0,0 @@ -ints = [1,2,3] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.json deleted file mode 100644 index 478fa5c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "mixed": { - "type": "array", - "value": [ - {"type": "array", "value": [ - {"type": "integer", "value": "1"}, - {"type": "integer", "value": "2"} - ]}, - {"type": "array", "value": [ - {"type": "string", "value": "a"}, - {"type": "string", "value": "b"} - ]}, - {"type": "array", "value": [ - {"type": "float", "value": "1.1"}, - {"type": "float", "value": "2.1"} - ]} - ] - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.toml deleted file mode 100644 index a246fcf..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-hetergeneous.toml +++ /dev/null @@ -1 +0,0 @@ -mixed = [[1, 2], ["a", "b"], [1.1, 2.1]] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.json deleted file mode 100644 index d21920c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "nest": { - "type": "array", - "value": [ - {"type": "array", "value": [ - {"type": "string", "value": "a"} - ]}, - {"type": "array", "value": [ - {"type": "string", "value": "b"} - ]} - ] - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.toml deleted file mode 100644 index ce33022..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays-nested.toml +++ /dev/null @@ -1 +0,0 @@ -nest = [["a"], ["b"]] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.json deleted file mode 100644 index 58aedbc..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "ints": { - "type": "array", - "value": [ - {"type": "integer", "value": "1"}, - {"type": "integer", "value": "2"}, - {"type": "integer", "value": "3"} - ] - }, - "floats": { - "type": "array", - "value": [ - {"type": "float", "value": "1.1"}, - {"type": "float", "value": "2.1"}, - {"type": "float", "value": "3.1"} - ] - }, - "strings": { - "type": "array", - "value": [ - {"type": "string", "value": "a"}, - {"type": "string", "value": "b"}, - {"type": "string", "value": "c"} - ] - }, - "dates": { - "type": "array", - "value": [ - {"type": "datetime", "value": "1987-07-05T17:45:00Z"}, - {"type": "datetime", "value": "1979-05-27T07:32:00Z"}, - {"type": "datetime", "value": "2006-06-01T11:00:00Z"} - ] - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.toml deleted file mode 100644 index c435f57..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/arrays.toml +++ /dev/null @@ -1,8 +0,0 @@ -ints = [1, 2, 3] -floats = [1.1, 2.1, 3.1] -strings = ["a", "b", "c"] -dates = [ - 1987-07-05T17:45:00Z, - 1979-05-27T07:32:00Z, - 2006-06-01T11:00:00Z, -] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.json deleted file mode 100644 index ae368e9..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "f": {"type": "bool", "value": "false"}, - "t": {"type": "bool", "value": "true"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.toml deleted file mode 100644 index a8a829b..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/bool.toml +++ /dev/null @@ -1,2 +0,0 @@ -t = true -f = false diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.json deleted file mode 100644 index e69a2e9..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "group": { - "answer": {"type": "integer", "value": "42"}, - "more": { - "type": "array", - "value": [ - {"type": "integer", "value": "42"}, - {"type": "integer", "value": "42"} - ] - } - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.toml deleted file mode 100644 index 3dca74c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/comments-everywhere.toml +++ /dev/null @@ -1,24 +0,0 @@ -# Top comment. - # Top comment. -# Top comment. - -# [no-extraneous-groups-please] - -[group] # Comment -answer = 42 # Comment -# no-extraneous-keys-please = 999 -# Inbetween comment. -more = [ # Comment - # What about multiple # comments? - # Can you handle it? - # - # Evil. -# Evil. - 42, 42, # Comments within arrays are fun. - # What about multiple # comments? - # Can you handle it? - # - # Evil. -# Evil. -# ] Did I fool you? -] # Hopefully not. diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.json deleted file mode 100644 index 2ca93ce..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "bestdayever": {"type": "datetime", "value": "1987-07-05T17:45:00Z"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.toml deleted file mode 100644 index 2e99340..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/datetime.toml +++ /dev/null @@ -1 +0,0 @@ -bestdayever = 1987-07-05T17:45:00Z diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.json deleted file mode 100644 index 0967ef4..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/empty.toml deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.json deleted file mode 100644 index 48aa907..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "best-day-ever": {"type": "datetime", "value": "1987-07-05T17:45:00Z"}, - "numtheory": { - "boring": {"type": "bool", "value": "false"}, - "perfection": { - "type": "array", - "value": [ - {"type": "integer", "value": "6"}, - {"type": "integer", "value": "28"}, - {"type": "integer", "value": "496"} - ] - } - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.toml deleted file mode 100644 index 8cb02e0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/example.toml +++ /dev/null @@ -1,5 +0,0 @@ -best-day-ever = 1987-07-05T17:45:00Z - -[numtheory] -boring = false -perfection = [6, 28, 496] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.json deleted file mode 100644 index b8a2e97..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "pi": {"type": "float", "value": "3.14"}, - "negpi": {"type": "float", "value": "-3.14"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.toml deleted file mode 100644 index 7c528d2..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/float.toml +++ /dev/null @@ -1,2 +0,0 @@ -pi = 3.14 -negpi = -3.14 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.json deleted file mode 100644 index 374bd09..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "a": { - "better": {"type": "integer", "value": "43"}, - "b": { - "c": { - "answer": {"type": "integer", "value": "42"} - } - } - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.toml deleted file mode 100644 index c0e8865..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-after.toml +++ /dev/null @@ -1,5 +0,0 @@ -[a.b.c] -answer = 42 - -[a] -better = 43 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.json deleted file mode 100644 index 374bd09..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "a": { - "better": {"type": "integer", "value": "43"}, - "b": { - "c": { - "answer": {"type": "integer", "value": "42"} - } - } - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.toml deleted file mode 100644 index eee68ff..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-and-explicit-before.toml +++ /dev/null @@ -1,5 +0,0 @@ -[a] -better = 43 - -[a.b.c] -answer = 42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.json deleted file mode 100644 index fbae7fc..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "a": { - "b": { - "c": { - "answer": {"type": "integer", "value": "42"} - } - } - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.toml deleted file mode 100644 index b6333e4..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/implicit-groups.toml +++ /dev/null @@ -1,2 +0,0 @@ -[a.b.c] -answer = 42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.json deleted file mode 100644 index 61985a1..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "answer": {"type": "integer", "value": "42"}, - "neganswer": {"type": "integer", "value": "-42"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.toml deleted file mode 100644 index c4f6297..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/integer.toml +++ /dev/null @@ -1,2 +0,0 @@ -answer = 42 -neganswer = -42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.json deleted file mode 100644 index 1f8709a..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "answer": {"type": "integer", "value": "42"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.toml deleted file mode 100644 index 560901c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-equals-nospace.toml +++ /dev/null @@ -1 +0,0 @@ -answer=42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.json deleted file mode 100644 index 1e7a75b..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ab": {"type": "integer", "value": "1"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.toml deleted file mode 100644 index 00db10f..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space-modified.toml +++ /dev/null @@ -1 +0,0 @@ - ab = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.json deleted file mode 100644 index 9d1f769..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a b": {"type": "integer", "value": "1"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.toml deleted file mode 100644 index 4b8ed09..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-space.toml +++ /dev/null @@ -1 +0,0 @@ - a b = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.json deleted file mode 100644 index a357b35..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_-1234567890": { - "type": "integer", "value": "1" - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.toml deleted file mode 100644 index 9d76736..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars-modified.toml +++ /dev/null @@ -1 +0,0 @@ -_-1234567890 = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.json deleted file mode 100644 index 85aa407..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "~!@$^&*()_+-`1234567890[]\\|/?><.,;:'": { - "type": "integer", "value": "1" - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.toml deleted file mode 100644 index b6db066..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/key-special-chars.toml +++ /dev/null @@ -1 +0,0 @@ -~!@$^&*()_+-`1234567890[]\|/?><.,;:' = 1 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.json deleted file mode 100644 index f0e6a60..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "plain": {"type": "integer", "value": "1"}, - "\"with.dot\"": {"type": "integer", "value": "2"}, - "plain_table": { - "plain": {"type": "integer", "value": "3"}, - "\"with.dot\"": {"type": "integer", "value": "4"} - }, - "table": { - "withdot": { - "plain": {"type": "integer", "value": "5"}, - "\"key.with.dots\"": {"type": "integer", "value": "6"} - } - } -} \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.toml deleted file mode 100644 index 2490592..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots-modified.toml +++ /dev/null @@ -1,10 +0,0 @@ -plain = 1 -"with.dot" = 2 - -[plain_table] -plain = 3 -"with.dot" = 4 - -[table.withdot] -plain = 5 -"key.with.dots" = 6 \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.json deleted file mode 100644 index d2ee002..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "plain": {"type": "integer", "value": "1"}, - "with.dot": {"type": "integer", "value": "2"}, - "plain_table": { - "plain": {"type": "integer", "value": "3"}, - "with.dot": {"type": "integer", "value": "4"} - }, - "table": { - "withdot": { - "plain": {"type": "integer", "value": "5"}, - "key.with.dots": {"type": "integer", "value": "6"} - } - } -} \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.toml deleted file mode 100644 index a44f3d3..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/keys-with-dots.toml +++ /dev/null @@ -1,10 +0,0 @@ -plain = 1 -with.dot = 2 - -[plain_table] -plain = 3 -with.dot = 4 - -[table.withdot] -plain = 5 -key.with.dots = 6 \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.json deleted file mode 100644 index 8ceed47..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "longpi": {"type": "float", "value": "3.141592653589793"}, - "neglongpi": {"type": "float", "value": "-3.141592653589793"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.toml deleted file mode 100644 index 9558ae4..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-float.toml +++ /dev/null @@ -1,2 +0,0 @@ -longpi = 3.141592653589793 -neglongpi = -3.141592653589793 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.json deleted file mode 100644 index 16c331e..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "answer": {"type": "integer", "value": "9223372036854775807"}, - "neganswer": {"type": "integer", "value": "-9223372036854775808"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.toml deleted file mode 100644 index 424a13a..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/long-integer.toml +++ /dev/null @@ -1,2 +0,0 @@ -answer = 9223372036854775807 -neganswer = -9223372036854775808 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.json deleted file mode 100644 index 075bf50..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "multiline_empty_one": { - "type": "string", - "value": "" - }, - "multiline_empty_two": { - "type": "string", - "value": "" - }, - "multiline_empty_three": { - "type": "string", - "value": "" - }, - "multiline_empty_four": { - "type": "string", - "value": "" - }, - "equivalent_one": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - }, - "equivalent_two": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - }, - "equivalent_three": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.toml deleted file mode 100644 index 15b1143..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string-modified.toml +++ /dev/null @@ -1,23 +0,0 @@ -multiline_empty_one = """""" -multiline_empty_two = """ -""" -multiline_empty_three = """\ - """ -multiline_empty_four = """\ - \ - \ - """ - -equivalent_one = "The quick brown fox jumps over the lazy dog." -equivalent_two = """ -The quick brown \ - - - fox jumps over \ - the lazy dog.""" - -equivalent_three = """\ - The quick brown \ - fox jumps over \ - the lazy dog.\ - """ diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.json deleted file mode 100644 index 1952370..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "multiline empty one": { - "type": "string", - "value": "" - }, - "multiline empty two": { - "type": "string", - "value": "" - }, - "multiline empty three": { - "type": "string", - "value": "" - }, - "multiline empty four": { - "type": "string", - "value": "" - }, - "equivalent one": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - }, - "equivalent two": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - }, - "equivalent three": { - "type": "string", - "value": "The quick brown fox jumps over the lazy dog." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.toml deleted file mode 100644 index cadd048..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/multiline-string.toml +++ /dev/null @@ -1,23 +0,0 @@ -multiline empty one = """""" -multiline empty two = """ -""" -multiline empty three = """\ - """ -multiline empty four = """\ - \ - \ - """ - -equivalent one = "The quick brown fox jumps over the lazy dog." -equivalent two = """ -The quick brown \ - - - fox jumps over \ - the lazy dog.""" - -equivalent three = """\ - The quick brown \ - fox jumps over \ - the lazy dog.\ - """ diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.json deleted file mode 100644 index b43cce5..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "oneline": { - "type": "string", - "value": "This string has a ' quote character." - }, - "firstnl": { - "type": "string", - "value": "This string has a ' quote character." - }, - "multiline": { - "type": "string", - "value": "This string\nhas ' a quote character\nand more than\none newline\nin it." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.toml deleted file mode 100644 index 8094c03..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-multiline-string.toml +++ /dev/null @@ -1,9 +0,0 @@ -oneline = '''This string has a ' quote character.''' -firstnl = ''' -This string has a ' quote character.''' -multiline = ''' -This string -has ' a quote character -and more than -one newline -in it.''' diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.json deleted file mode 100644 index 693ab9b..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "backspace": { - "type": "string", - "value": "This string has a \\b backspace character." - }, - "tab": { - "type": "string", - "value": "This string has a \\t tab character." - }, - "newline": { - "type": "string", - "value": "This string has a \\n new line character." - }, - "formfeed": { - "type": "string", - "value": "This string has a \\f form feed character." - }, - "carriage": { - "type": "string", - "value": "This string has a \\r carriage return character." - }, - "slash": { - "type": "string", - "value": "This string has a \\/ slash character." - }, - "backslash": { - "type": "string", - "value": "This string has a \\\\ backslash character." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.toml deleted file mode 100644 index 92acd25..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/raw-string.toml +++ /dev/null @@ -1,7 +0,0 @@ -backspace = 'This string has a \b backspace character.' -tab = 'This string has a \t tab character.' -newline = 'This string has a \n new line character.' -formfeed = 'This string has a \f form feed character.' -carriage = 'This string has a \r carriage return character.' -slash = 'This string has a \/ slash character.' -backslash = 'This string has a \\ backslash character.' diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.json deleted file mode 100644 index 6c26d69..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "answer": { - "type": "string", - "value": "" - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.toml deleted file mode 100644 index e37e681..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-empty.toml +++ /dev/null @@ -1 +0,0 @@ -answer = "" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.json deleted file mode 100644 index 5c7bb31..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "backspace": { - "type": "string", - "value": "This string has a \u0008 backspace character." - }, - "tab": { - "type": "string", - "value": "This string has a \u0009 tab character." - }, - "newline": { - "type": "string", - "value": "This string has a \u000A new line character." - }, - "formfeed": { - "type": "string", - "value": "This string has a \u000C form feed character." - }, - "carriage": { - "type": "string", - "value": "This string has a \u000D carriage return character." - }, - "quote": { - "type": "string", - "value": "This string has a \u0022 quote character." - }, - "backslash": { - "type": "string", - "value": "This string has a \u005C backslash character." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.toml deleted file mode 100644 index aae22b0..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes-modified.toml +++ /dev/null @@ -1,7 +0,0 @@ -backspace = "This string has a \b backspace character." -tab = "This string has a \t tab character." -newline = "This string has a \n new line character." -formfeed = "This string has a \f form feed character." -carriage = "This string has a \r carriage return character." -quote = "This string has a \" quote character." -backslash = "This string has a \\ backslash character." diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.json deleted file mode 100644 index ca71d30..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "backspace": { - "type": "string", - "value": "This string has a \u0008 backspace character." - }, - "tab": { - "type": "string", - "value": "This string has a \u0009 tab character." - }, - "newline": { - "type": "string", - "value": "This string has a \u000A new line character." - }, - "formfeed": { - "type": "string", - "value": "This string has a \u000C form feed character." - }, - "carriage": { - "type": "string", - "value": "This string has a \u000D carriage return character." - }, - "quote": { - "type": "string", - "value": "This string has a \u0022 quote character." - }, - "slash": { - "type": "string", - "value": "This string has a \u002F slash character." - }, - "backslash": { - "type": "string", - "value": "This string has a \u005C backslash character." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.toml deleted file mode 100644 index 2d64500..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-escapes.toml +++ /dev/null @@ -1,8 +0,0 @@ -backspace = "This string has a \b backspace character." -tab = "This string has a \t tab character." -newline = "This string has a \n new line character." -formfeed = "This string has a \f form feed character." -carriage = "This string has a \r carriage return character." -quote = "This string has a \" quote character." -slash = "This string has a \/ slash character." -backslash = "This string has a \\ backslash character." diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.json deleted file mode 100644 index 2e05f99..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "answer": { - "type": "string", - "value": "You are not drinking enough whisky." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.toml deleted file mode 100644 index e17ade6..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-simple.toml +++ /dev/null @@ -1 +0,0 @@ -answer = "You are not drinking enough whisky." diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.json deleted file mode 100644 index 33cdc9c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "pound": {"type": "string", "value": "We see no # comments here."}, - "poundcomment": { - "type": "string", - "value": "But there are # some comments here." - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.toml deleted file mode 100644 index 5fd8746..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/string-with-pound.toml +++ /dev/null @@ -1,2 +0,0 @@ -pound = "We see no # comments here." -poundcomment = "But there are # some comments here." # Did I # mess you up? diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.json deleted file mode 100644 index 32e4640..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "albums": { - "songs": [ - {"name": {"type": "string", "value": "Glory Days"}} - ] - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.toml deleted file mode 100644 index 3157ac9..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-implicit.toml +++ /dev/null @@ -1,2 +0,0 @@ -[[albums.songs]] -name = "Glory Days" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.json deleted file mode 100644 index 84df2da..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "people": [ - { - "first_name": {"type": "string", "value": "Bruce"}, - "last_name": {"type": "string", "value": "Springsteen"} - }, - { - "first_name": {"type": "string", "value": "Eric"}, - "last_name": {"type": "string", "value": "Clapton"} - }, - { - "first_name": {"type": "string", "value": "Bob"}, - "last_name": {"type": "string", "value": "Seger"} - } - ] -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.toml deleted file mode 100644 index 46062be..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-many.toml +++ /dev/null @@ -1,11 +0,0 @@ -[[people]] -first_name = "Bruce" -last_name = "Springsteen" - -[[people]] -first_name = "Eric" -last_name = "Clapton" - -[[people]] -first_name = "Bob" -last_name = "Seger" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.json deleted file mode 100644 index c117afa..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "albums": [ - { - "name": {"type": "string", "value": "Born to Run"}, - "songs": [ - {"name": {"type": "string", "value": "Jungleland"}}, - {"name": {"type": "string", "value": "Meeting Across the River"}} - ] - }, - { - "name": {"type": "string", "value": "Born in the USA"}, - "songs": [ - {"name": {"type": "string", "value": "Glory Days"}}, - {"name": {"type": "string", "value": "Dancing in the Dark"}} - ] - } - ] -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.toml deleted file mode 100644 index ce3cae1..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest-modified.toml +++ /dev/null @@ -1,17 +0,0 @@ -[[albums]] -name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] -name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.json deleted file mode 100644 index c117afa..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "albums": [ - { - "name": {"type": "string", "value": "Born to Run"}, - "songs": [ - {"name": {"type": "string", "value": "Jungleland"}}, - {"name": {"type": "string", "value": "Meeting Across the River"}} - ] - }, - { - "name": {"type": "string", "value": "Born in the USA"}, - "songs": [ - {"name": {"type": "string", "value": "Glory Days"}}, - {"name": {"type": "string", "value": "Dancing in the Dark"}} - ] - } - ] -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.toml deleted file mode 100644 index d659a3d..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-nest.toml +++ /dev/null @@ -1,17 +0,0 @@ -[[albums]] -name = "Born to Run" - - [[albums.songs]] - name = "Jungleland" - - [[albums.songs]] - name = "Meeting Across the River" - -[[albums]] -name = "Born in the USA" - - [[albums.songs]] - name = "Glory Days" - - [[albums.songs]] - name = "Dancing in the Dark" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.json deleted file mode 100644 index d75faae..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "people": [ - { - "first_name": {"type": "string", "value": "Bruce"}, - "last_name": {"type": "string", "value": "Springsteen"} - } - ] -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.toml deleted file mode 100644 index cd7e1b6..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-array-one.toml +++ /dev/null @@ -1,3 +0,0 @@ -[[people]] -first_name = "Bruce" -last_name = "Springsteen" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.json deleted file mode 100644 index 6f3873a..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": {} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.toml deleted file mode 100644 index 8bb6a0a..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-empty.toml +++ /dev/null @@ -1 +0,0 @@ -[a] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.json deleted file mode 100644 index 9787770..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": { "b": {} } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.toml deleted file mode 100644 index 70b7fe1..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-sub-empty.toml +++ /dev/null @@ -1,2 +0,0 @@ -[a] -[a.b] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.json deleted file mode 100644 index 3a73ec8..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "valid key": {} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.toml deleted file mode 100644 index 798756c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-whitespace.toml +++ /dev/null @@ -1 +0,0 @@ -[valid key] diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.json deleted file mode 100644 index 5e594e4..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "key#group": { - "answer": {"type": "integer", "value": "42"} - } -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.toml deleted file mode 100644 index e7b777e..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/table-with-pound.toml +++ /dev/null @@ -1,2 +0,0 @@ -[key#group] -answer = 42 diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.json deleted file mode 100644 index deda62c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "answer": {"type": "string", "value": "\u03B4"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.toml deleted file mode 100644 index 057ce15..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-escape.toml +++ /dev/null @@ -1 +0,0 @@ -answer = "\u03B4" diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.json b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.json deleted file mode 100644 index 00aa2f8..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "answer": {"type": "string", "value": "δ"} -} diff --git a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.toml b/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.toml deleted file mode 100644 index c65723c..0000000 --- a/src/test/resources/com/moandjiezana/toml/burntsushi/valid/unicode-literal.toml +++ /dev/null @@ -1 +0,0 @@ -answer = "δ" diff --git a/src/test/resources/com/moandjiezana/toml/example-v0.4.0.toml b/src/test/resources/com/moandjiezana/toml/example-v0.4.0.toml deleted file mode 100644 index e131527..0000000 --- a/src/test/resources/com/moandjiezana/toml/example-v0.4.0.toml +++ /dev/null @@ -1,244 +0,0 @@ -################################################################################ -## Comment - -# Speak your mind with the hash symbol. They go from the symbol to the end of -# the line. - - -################################################################################ -## Table - -# Tables (also known as hash tables or dictionaries) are collections of -# key/value pairs. They appear in square brackets on a line by themselves. - -[table] - -key = "value" # Yeah, you can do this. - -# Nested tables are denoted by table names with dots in them. Name your tables -# whatever crap you please, just don't use #, ., [ or ]. - -[table.subtable] - -key = "another value" - -# You don't need to specify all the super-tables if you don't want to. TOML -# knows how to do it for you. - -# [x] you -# [x.y] don't -# [x.y.z] need these -[x.y.z.w] # for this to work - - -################################################################################ -## Inline Table - -# Inline tables provide a more compact syntax for expressing tables. They are -# especially useful for grouped data that can otherwise quickly become verbose. -# Inline tables are enclosed in curly braces `{` and `}`. No newlines are -# allowed between the curly braces unless they are valid within a value. - -[table.inline] - -name = { first = "Tom", last = "Preston-Werner" } -point = { x = 1, y = 2 } - - -################################################################################ -## String - -# There are four ways to express strings: basic, multi-line basic, literal, and -# multi-line literal. All strings must contain only valid UTF-8 characters. - -[string.basic] - -basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." - -[string.multiline] - -# The following strings are byte-for-byte equivalent: -key1 = "One\nTwo" -key2 = """One\nTwo""" -key3 = """ -One -Two""" - -[string.multiline.continued] - -# The following strings are byte-for-byte equivalent: -key1 = "The quick brown fox jumps over the lazy dog." - -key2 = """ -The quick brown \ - - - fox jumps over \ - the lazy dog.""" - -key3 = """\ - The quick brown \ - fox jumps over \ - the lazy dog.\ - """ - -[string.literal] - -# What you see is what you get. -winpath = 'C:\Users\nodejs\templates' -winpath2 = '\\ServerX\admin$\system32\' -quoted = 'Tom "Dubs" Preston-Werner' -regex = '<\i\c*\s*>' - - -[string.literal.multiline] - -regex2 = '''I [dw]on't need \d{2} apples''' -lines = ''' -The first newline is -trimmed in raw strings. - All other whitespace - is preserved. -''' - - -################################################################################ -## Integer - -# Integers are whole numbers. Positive numbers may be prefixed with a plus sign. -# Negative numbers are prefixed with a minus sign. - -[integer] - -key1 = +99 -key2 = 42 -key3 = 0 -key4 = -17 - -[integer.underscores] - -# For large numbers, you may use underscores to enhance readability. Each -# underscore must be surrounded by at least one digit. -key1 = 1_000 -key2 = 5_349_221 -key3 = 1_2_3_4_5 # valid but inadvisable - - -################################################################################ -## Float - -# A float consists of an integer part (which may be prefixed with a plus or -# minus sign) followed by a fractional part and/or an exponent part. - -[float.fractional] - -key1 = +1.0 -key2 = 3.1415 -key3 = -0.01 - -[float.exponent] - -key1 = 5e+22 -key2 = 1e6 -key3 = -2E-2 - -[float.both] - -key = 6.626e-34 - -[float.underscores] - -key1 = 9_224_617.445_991_228_313 -key2 = 1e1_000 - - -################################################################################ -## Boolean - -# Booleans are just the tokens you're used to. Always lowercase. - -[boolean] - -True = true -False = false - - -################################################################################ -## Datetime - -# Datetimes are RFC 3339 dates. - -[datetime] - -key1 = 1979-05-27T07:32:00Z -key2 = 1979-05-27T00:32:00-07:00 -key3 = 1979-05-27T00:32:00.999-07:00 - - -################################################################################ -## Array - -# Arrays are square brackets with other primitives inside. Whitespace is -# ignored. Elements are separated by commas. Data types may not be mixed. - -[array] - -key1 = [ 1, 2, 3 ] -key2 = [ "red", "yellow", "green" ] -key3 = [ [ 1, 2 ], [3, 4, 5] ] -key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok - -# Arrays can also be multiline. So in addition to ignoring whitespace, arrays -# also ignore newlines between the brackets. Terminating commas are ok before -# the closing bracket. - -key5 = [ - 1, 2, 3 -] -key6 = [ - 1, - 2, # this is ok -] - - -################################################################################ -## Array of Tables - -# These can be expressed by using a table name in double brackets. Each table -# with the same double bracketed name will be an element in the array. The -# tables are inserted in the order encountered. - -[[products]] - -name = "Hammer" -sku = 738594937 - -[[products]] - -[[products]] - -name = "Nail" -sku = 284758393 -color = "gray" - - -# You can create nested arrays of tables as well. - -[[fruit]] - name = "apple" - - [fruit.physical] - color = "red" - shape = "round" - - [[fruit.variety]] - name = "red delicious" - - [[fruit.variety]] - name = "granny smith" - -[[fruit]] - name = "banana" - - [[fruit.variety]] - name = "plantain" diff --git a/src/test/resources/com/moandjiezana/toml/example.toml b/src/test/resources/com/moandjiezana/toml/example.toml deleted file mode 100644 index f8aae14..0000000 --- a/src/test/resources/com/moandjiezana/toml/example.toml +++ /dev/null @@ -1,36 +0,0 @@ -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - country = "中国" # This should be parsed as UTF-8 - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] diff --git a/src/test/resources/com/moandjiezana/toml/fruit_table_array.toml b/src/test/resources/com/moandjiezana/toml/fruit_table_array.toml deleted file mode 100644 index ced9e2a..0000000 --- a/src/test/resources/com/moandjiezana/toml/fruit_table_array.toml +++ /dev/null @@ -1,18 +0,0 @@ -[[fruit]] - name = "apple" - - [fruit.physical] - color = "red" - shape = "round" - - [[fruit.variety]] - name = "red delicious" - - [[fruit.variety]] - name = "granny smith" - -[[fruit]] - name = "banana" - - [[fruit.variety]] - name = "plantain" diff --git a/src/test/resources/com/moandjiezana/toml/hard_example.toml b/src/test/resources/com/moandjiezana/toml/hard_example.toml deleted file mode 100644 index ff82699..0000000 --- a/src/test/resources/com/moandjiezana/toml/hard_example.toml +++ /dev/null @@ -1,33 +0,0 @@ -# Test file for TOML -# Only this one tries to emulate a TOML file written by a user of the kind of parser writers probably hate -# This part you'll really hate - -[the] -test_string = "You'll hate me after this - #" # " Annoying, isn't it? - - [the.hard] - test_array = [ "] ", " # "] # ] There you go, parse this! - test_array2 = [ "Test #11 ]proved that", "Experiment #9 was a success" ] - # You didn't think it'd as easy as chucking out the last #, did you? - another_test_string = " Same thing, but with a string #" - harder_test_string = " And when \"'s are in the string, along with # \"" # "and comments are there too" - # Things will get harder - - [the.hard."bit#"] - "what?" = "You don't think some user won't do that?" - multi_line_array = [ - "]", - # ] Oh yes I did - ] - -# Each of the following keygroups/key value pairs should produce an error. Uncomment to them to test - -#[error] if you didn't catch this, your parser is broken -#string = "Anything other than tabs, spaces and newline after a keygroup or key value pair has ended should produce an error unless it is a comment" like this -#array = [ -# "This might most likely happen in multiline arrays", -# Like here, -# "or here, -# and here" -# ] End of array comment, forgot the # -#number = 3.14 pi <--again forgot the # diff --git a/src/test/resources/com/moandjiezana/toml/hard_example_errors.toml b/src/test/resources/com/moandjiezana/toml/hard_example_errors.toml deleted file mode 100644 index 3040e70..0000000 --- a/src/test/resources/com/moandjiezana/toml/hard_example_errors.toml +++ /dev/null @@ -1,11 +0,0 @@ -# Each of the following keygroups/key value pairs should produce an error. Uncomment to them to test - -[error] if you didn't catch this, your parser is broken -#string = "Anything other than tabs, spaces and newline after a keygroup or key value pair has ended should produce an error unless it is a comment" like this -#array = [ -# "This might most likely happen in multiline arrays", -# Like here, -# "or here, -# and here" -# ] End of array comment, forgot the # -#number = 3.14 pi <--again forgot the # \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/products_table_array.toml b/src/test/resources/com/moandjiezana/toml/products_table_array.toml deleted file mode 100644 index ac3883b..0000000 --- a/src/test/resources/com/moandjiezana/toml/products_table_array.toml +++ /dev/null @@ -1,10 +0,0 @@ -[[products]] -name = "Hammer" -sku = 738594937 - -[[products]] - -[[products]] -name = "Nail" -sku = 284758393 -color = "gray" diff --git a/src/test/resources/com/moandjiezana/toml/should_allow_comment_after_values.toml b/src/test/resources/com/moandjiezana/toml/should_allow_comment_after_values.toml deleted file mode 100644 index 2d8cc4b..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_allow_comment_after_values.toml +++ /dev/null @@ -1,12 +0,0 @@ -a = 1 # comment -b = 1.1 # comment -c = "abc" # comment -d = 2014-08-04T13:47:00Z # comment -e = ["a", "b"] # comment -f = true # comment -g = """abc""" # comment -h = '''abc''' # comment -i = """abc -abc""" # comment -j = '''abc -abc''' # comment \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_allow_keys_with_same_name_in_different_tables.toml b/src/test/resources/com/moandjiezana/toml/should_allow_keys_with_same_name_in_different_tables.toml deleted file mode 100644 index 471c639..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_allow_keys_with_same_name_in_different_tables.toml +++ /dev/null @@ -1,4 +0,0 @@ -[siteInfo.local.sh] -enable=true -[siteInfo.localMobile.sh] -enable=false diff --git a/src/test/resources/com/moandjiezana/toml/should_allow_multiline_array.toml b/src/test/resources/com/moandjiezana/toml/should_allow_multiline_array.toml deleted file mode 100644 index d07d7ab..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_allow_multiline_array.toml +++ /dev/null @@ -1,5 +0,0 @@ -a = [ - "a", - "b", - "c" -] \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_convert_extra_primitives.toml b/src/test/resources/com/moandjiezana/toml/should_convert_extra_primitives.toml deleted file mode 100644 index 98cb4cf..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_convert_extra_primitives.toml +++ /dev/null @@ -1,12 +0,0 @@ -bigDecimal=1.2 -bigInteger=5 -aShort=3 -anInteger=7 -character="u" -elementType="CONSTRUCTOR" -url="http://www.example.com" -uri="http://www.test.com" -set=["a", "b"] -strings=["c", "d"] -[group] - key="value" diff --git a/src/test/resources/com/moandjiezana/toml/should_convert_primitive_values.toml b/src/test/resources/com/moandjiezana/toml/should_convert_primitive_values.toml deleted file mode 100644 index db4fe25..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_convert_primitive_values.toml +++ /dev/null @@ -1,5 +0,0 @@ -string = "string" -number = 123 -decimal = 2.1 -bool = true -date = 1979-05-27T07:32:00Z diff --git a/src/test/resources/com/moandjiezana/toml/should_convert_table_array_to_class.toml b/src/test/resources/com/moandjiezana/toml/should_convert_table_array_to_class.toml deleted file mode 100644 index eeed352..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_convert_table_array_to_class.toml +++ /dev/null @@ -1,10 +0,0 @@ -name="My Name" - -[primitives] - number=12 - -[[groupers]] - string="grouper 1" - -[[groupers]] - string="grouper 2" \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_convert_tables.toml b/src/test/resources/com/moandjiezana/toml/should_convert_tables.toml deleted file mode 100644 index 6739093..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_convert_tables.toml +++ /dev/null @@ -1,5 +0,0 @@ -[group1] - string = "value1" - -[group2] - string = "value2" \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_get_basic_multiline_string.toml b/src/test/resources/com/moandjiezana/toml/should_get_basic_multiline_string.toml deleted file mode 100644 index 2c4ebf7..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_get_basic_multiline_string.toml +++ /dev/null @@ -1,5 +0,0 @@ -ref = "One\nTwo" -one_line = """One\nTwo""" # comment -many_lines = """ -One -Two""" # comment \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml b/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml deleted file mode 100644 index 98c5c05..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_get_literal_string.toml +++ /dev/null @@ -1,4 +0,0 @@ -winpath = 'C:\Users\nodejs\templates' -winpath2 = '\\ServerX\admin$\system32\' # comment -quoted = 'Tom "Dubs" Preston-Werner' -regex = '<\i\c*\s*>' diff --git a/src/test/resources/com/moandjiezana/toml/should_get_multiline_literal_string.toml b/src/test/resources/com/moandjiezana/toml/should_get_multiline_literal_string.toml deleted file mode 100644 index f9b5456..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_get_multiline_literal_string.toml +++ /dev/null @@ -1,12 +0,0 @@ -regex2_ref = "I [dw]on't need \\d{2} apples" -regex2 = '''I [dw]on't need \d{2} apples''' - -lines_ref = "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n" -lines = ''' -The first newline is -trimmed in raw strings. - All other whitespace - is preserved. -''' - -empty_line = '''''' diff --git a/src/test/resources/com/moandjiezana/toml/should_get_multiline_string_without_new_lines.toml b/src/test/resources/com/moandjiezana/toml/should_get_multiline_string_without_new_lines.toml deleted file mode 100644 index 1c16626..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_get_multiline_string_without_new_lines.toml +++ /dev/null @@ -1,14 +0,0 @@ -ref = "The quick brown fox jumps over the lazy dog." - -multi1 = """ -The quick brown \ - - - fox jumps over \ - the lazy dog.""" - -multi2 = """\ - The quick brown \ - fox jumps over \ - the lazy dog.\ - """ diff --git a/src/test/resources/com/moandjiezana/toml/should_load_from_file.toml b/src/test/resources/com/moandjiezana/toml/should_load_from_file.toml deleted file mode 100644 index 42863fd..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_load_from_file.toml +++ /dev/null @@ -1 +0,0 @@ -key = "value" \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_parse_table_array_out_of_order.toml b/src/test/resources/com/moandjiezana/toml/should_parse_table_array_out_of_order.toml deleted file mode 100644 index 7688f6b..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_parse_table_array_out_of_order.toml +++ /dev/null @@ -1,8 +0,0 @@ -[[product]] -price = 9.99 - -[[employee]] -name = "Marinus van der Lubbe" - -[[product]] -type = "ZX80" diff --git a/src/test/resources/com/moandjiezana/toml/should_support_array_of_inline_tables.toml b/src/test/resources/com/moandjiezana/toml/should_support_array_of_inline_tables.toml deleted file mode 100644 index 9f4e928..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_support_array_of_inline_tables.toml +++ /dev/null @@ -1,5 +0,0 @@ -points = [ { x = 1, y = 2, z = 3 }, - { x = 7, y = 8, z = 9 }, - { x = 2, y = 4, z = 8 }, - { x = "3", y = "6", z = "12" } -] diff --git a/src/test/resources/com/moandjiezana/toml/should_support_blank_line.toml b/src/test/resources/com/moandjiezana/toml/should_support_blank_line.toml deleted file mode 100644 index 1c43e2e..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_support_blank_line.toml +++ /dev/null @@ -1,5 +0,0 @@ -# Comment - -[group] - -key = 1 \ No newline at end of file diff --git a/src/test/resources/com/moandjiezana/toml/should_support_special_characters_in_strings.toml b/src/test/resources/com/moandjiezana/toml/should_support_special_characters_in_strings.toml deleted file mode 100644 index 7c54641..0000000 --- a/src/test/resources/com/moandjiezana/toml/should_support_special_characters_in_strings.toml +++ /dev/null @@ -1,3 +0,0 @@ -key = "\" \t \n \r \\ \b \f" -unicode_key = "more or less \u00B1" -unicode_key_uppercase = "more or less \U00B1"