blob: 562bbde70cf2c754087594e3f40027d29e53d9a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE
* file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file
* to You 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
*
* http://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.
*/
package org.apache.tuweni.toml;
import static org.apache.tuweni.toml.TomlPosition.positionAt;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
class MutableTomlTableTest {
@Test
void emptyTableIsEmpty() {
TomlTable table = new MutableTomlTable();
assertTrue(table.isEmpty());
assertEquals(0, table.size());
}
@Test
void getMissingPropertyReturnsNull() {
MutableTomlTable table = new MutableTomlTable();
table.set("bar", "one", positionAt(1, 1));
table.set("foo.baz", "two", positionAt(1, 1));
assertNull(table.get("baz"));
assertNull(table.get("foo.bar"));
assertNull(table.get("foo.bar.baz"));
}
@Test
void getStringProperty() {
MutableTomlTable table = new MutableTomlTable();
table.set("foo.bar", "one", positionAt(1, 1));
assertTrue(table.isString("foo.bar"));
assertEquals("one", table.getString("foo.bar"));
}
@Test
void shouldCreateParentTables() {
MutableTomlTable table = new MutableTomlTable();
table.set("foo.bar", "one", positionAt(1, 1));
assertTrue(table.isTable("foo"));
assertNotNull(table.getTable("foo"));
}
@Test
void cannotReplaceProperty() {
MutableTomlTable table = new MutableTomlTable();
table.set("foo.bar", "one", positionAt(1, 3));
TomlParseError e = assertThrows(TomlParseError.class, () -> {
table.set("foo.bar", "two", positionAt(2, 5));
});
assertEquals("foo.bar previously defined at line 1, column 3", e.getMessage());
}
@ParameterizedTest
@MethodSource("quotesComplexKeyInErrorSupplier")
void quotesComplexKeysInError(List<String> path, String expected) {
MutableTomlTable table = new MutableTomlTable();
table.set(path, "one", positionAt(1, 3));
TomlParseError e = assertThrows(TomlParseError.class, () -> {
table.set(path, "two", positionAt(2, 5));
});
assertEquals(expected + " previously defined at line 1, column 3", e.getMessage());
}
private static Stream<Arguments> quotesComplexKeyInErrorSupplier() {
return Stream.of(
Arguments.of(Arrays.asList("", "bar"), "\"\".bar"),
Arguments.of(Arrays.asList("foo ", "bar"), "\"foo \".bar"),
Arguments.of(Arrays.asList("foo\n", "bar"), "\"foo\\n\".bar"));
}
@Test
void cannotTreatNonTableAsTable() {
MutableTomlTable table = new MutableTomlTable();
table.set("foo.bar", "one", positionAt(5, 3));
TomlParseError e = assertThrows(TomlParseError.class, () -> {
table.set("foo.bar.baz", "two", positionAt(2, 5));
});
assertEquals("foo.bar is not a table (previously defined at line 5, column 3)", e.getMessage());
}
@Test
void ignoresWhitespaceInUnquotedKeys() {
MutableTomlTable table = new MutableTomlTable();
table.set("foo.bar", 4, positionAt(5, 3));
assertEquals(Long.valueOf(4), table.getLong(" foo . bar"));
table.set(Arrays.asList(" Bar ", " B A Z "), 9, positionAt(5, 3));
assertEquals(Long.valueOf(9), table.getLong("' Bar '. \" B A Z \""));
}
@Test
void throwsForInvalidKey() {
MutableTomlTable table = new MutableTomlTable();
IllegalArgumentException e = assertThrows(IllegalArgumentException.class, () -> {
table.get("foo.=bar");
});
assertEquals("Invalid key: Unexpected '=', expected a-z, A-Z, 0-9, ', or \"", e.getMessage());
}
@Test
void shouldReturnInputPosition() {
MutableTomlTable table = new MutableTomlTable();
table.set("bar", "one", positionAt(4, 3));
table.set("foo.baz", "two", positionAt(15, 2));
assertEquals(positionAt(4, 3), table.inputPositionOf("bar"));
assertEquals(positionAt(15, 2), table.inputPositionOf("foo.baz"));
assertNull(table.inputPositionOf("baz"));
assertNull(table.inputPositionOf("foo.bar"));
assertNull(table.inputPositionOf("foo.bar.baz"));
}
@Test
void shouldReturnKeySet() {
MutableTomlTable table = new MutableTomlTable();
table.set("bar", "one", positionAt(4, 3));
table.set("foo.baz", "two", positionAt(15, 2));
assertEquals(new HashSet<>(Arrays.asList("bar", "foo")), table.keySet());
}
@Test
void shouldReturnDottedKeySet() {
MutableTomlTable table = new MutableTomlTable();
table.set("bar", "one", positionAt(4, 3));
table.set("foo.baz", "two", positionAt(15, 2));
table.set("foo.buz.bar", "three", positionAt(15, 2));
assertEquals(
new HashSet<>(Arrays.asList("bar", "foo", "foo.baz", "foo.buz", "foo.buz.bar")),
table.dottedKeySet(true));
assertEquals(new HashSet<>(Arrays.asList("bar", "foo.baz", "foo.buz.bar")), table.dottedKeySet());
}
@Test
void shouldSerializeToJSON() {
MutableTomlTable table = new MutableTomlTable();
table.set("bar", "one", positionAt(2, 1));
table.set("foo.baz", "two", positionAt(3, 2));
table.set("foo.buz", MutableTomlArray.EMPTY, positionAt(3, 2));
table.set("foo.foo", MutableTomlTable.EMPTY, positionAt(3, 2));
MutableTomlArray array = new MutableTomlArray();
array.append("hello\nthere", positionAt(5, 2));
array.append("goodbye", positionAt(5, 2));
table.set("foo.blah", array, positionAt(5, 2));
table.set("buz", OffsetDateTime.parse("1937-07-18T03:25:43-04:00"), positionAt(5, 2));
table.set("glad", LocalDateTime.parse("1937-07-18T03:25:43"), positionAt(5, 2));
table.set("zoo", LocalDate.parse("1937-07-18"), positionAt(5, 2));
table.set("alpha", LocalTime.parse("03:25:43"), positionAt(5, 2));
String expected = "{\n"
+ " \"alpha\" : \"03:25:43\",\n"
+ " \"bar\" : \"one\",\n"
+ " \"buz\" : \"1937-07-18T03:25:43-04:00\",\n"
+ " \"foo\" : {\n"
+ " \"baz\" : \"two\",\n"
+ " \"blah\" : [\n"
+ " \"hello\\nthere\",\n"
+ " \"goodbye\"\n"
+ " ],\n"
+ " \"buz\" : [],\n"
+ " \"foo\" : {}\n"
+ " },\n"
+ " \"glad\" : \"1937-07-18T03:25:43\",\n"
+ " \"zoo\" : \"1937-07-18\"\n"
+ "}\n";
assertEquals(expected.replace("\n", System.lineSeparator()), table.toJson());
}
}