/* * Copyright 2013 Samppa Saarela * * 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 * * 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.javersion.path; import org.javersion.path.PropertyPath.Key; import org.javersion.path.PropertyPath.Property; import org.javersion.path.PropertyPath.SubPath; import org.junit.Assert; import org.junit.Test; import java.util.Arrays; import java.util.HashSet; import java.util.List; import static com.google.common.collect.Sets.newHashSet; import static java.lang.Long.MIN_VALUE; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.javersion.path.PropertyPath.ROOT; import static org.javersion.path.PropertyPath.parse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class PropertyPathTest { @Test public void Path_Equals() { assertThat( children_0_name()).isEqualTo(children_0_name()); assertThat(children_0()).isEqualTo(children_0()); assertThat(children).isEqualTo(children); assertThat(ROOT).isEqualTo(ROOT); assertThat(children_0()).isNotEqualTo(children_0_name()); assertThat(children_0_name()).isNotEqualTo(children_0()); assertThat(parents_0_name).isNotEqualTo(parents_1_name); assertThat(_0).isNotEqualTo(_1); assertThat(children_0_name()).isNotEqualTo(parents_0_name); } @Test public void Hash_Code() { HashSet<PropertyPath> paths = newHashSet( ROOT, parents, children_0(), children_0_name() ); assertThat(paths).isEqualTo(newHashSet( ROOT, parents, children_0(), children_0_name() )); assertThat(paths.contains(parents_0_name)).isFalse(); assertThat(paths.contains(children)).isFalse(); } @Test public void To_String() { assertThat(_0.toString()).isEqualTo("[0]"); assertThat(children_0().toString()).isEqualTo("children[0]"); assertThat(children_0_name().toString()).isEqualTo("children[0].name"); } @Test public void Nested_Indexes() { assertThat(_1_0.toString()).isEqualTo("[1][0]"); } @Test public void special_characters_in_key() { PropertyPath path = ROOT.property("map").key("ä \t \n \u00DC \\ \"'"); assertThat(path.toString()).isEqualTo("map[\"\\u00E4 \\t \\n \\u00DC \\\\ \\\"\\'\"]"); assertThat(parse(path.toString())).isEqualTo(path); } @Test public void valid_properties() { assertValidProperty("valid"); assertValidProperty("$"); assertValidProperty("_123"); assertValidProperty("ääks"); assertValidProperty("\u00DCber"); } private void assertValidProperty(String property) { PropertyPath path = ROOT.property(property); assertThat(path.toString()).isEqualTo(property); assertThat(parse(path.toString())).isEqualTo(path); } @Test public void invalid_properties() { assertInvalidProperty("not valid"); assertInvalidProperty("1a"); assertInvalidProperty("[1]"); assertInvalidProperty("[\"key\"]"); assertInvalidProperty("~"); assertInvalidProperty("a.b"); assertInvalidProperty("a-b"); } private void assertInvalidProperty(String invalid) { try { ROOT.property(invalid); Assert.fail("succeeded parsing invalid property: " + invalid); } catch (IllegalArgumentException e) { // expected } } @Test public void any_key() { assertThat(parse("map{}")).isEqualTo(ROOT.property("map").anyKey()); } @Test public void any_index() { assertThat(parse("list[]")).isEqualTo(ROOT.property("list").anyIndex()); } @Test public void any_property() { assertThat(parse("object.*")).isEqualTo(ROOT.property("object").anyProperty()); } @Test(expected = IllegalArgumentException.class) public void property_should_not_start_with_digit() { parse("123åäö"); } @Test public void property_or_key() { assertThat(ROOT.propertyOrKey("åäö123")).isEqualTo(ROOT.property("åäö123")); assertThat(ROOT.propertyOrKey("123åäö")).isEqualTo(ROOT.key("123åäö")); assertThat(ROOT.propertyOrKey("not valid")).isEqualTo(ROOT.key("not valid")); assertThat(ROOT.propertyOrKey("isValid")).isEqualTo(ROOT.property("isValid")); assertThat(ROOT.propertyOrKey("a.b")).isEqualTo(ROOT.key("a.b")); assertThat(ROOT.propertyOrKey("a-b")).isEqualTo(ROOT.key("a-b")); } @Test public void parse_root() { assertThat(parse("")).isEqualTo(ROOT); } @Test(expected=IllegalArgumentException.class) public void Parse_Index() { parse("[index]"); } @Test(expected=IllegalArgumentException.class) public void Parse_Illegal_Start_2() { parse(".property"); } @Test(expected=IllegalArgumentException.class) public void Parse_Illegal_Index_1() { System.out.println(parse("list[[0]]")); } @Test public void Starts_With() { assertTrue(_1.startsWith(ROOT)); assertTrue(children_0_name().startsWith(children)); assertTrue(children_0_name().startsWith(ROOT)); assertTrue(children.startsWith(children)); assertFalse(children.startsWith(children_0_name())); assertFalse(ROOT.startsWith(_0)); } @Test(expected=IllegalArgumentException.class) public void Empty_Property_Name() { ROOT.property(""); } @Test public void Schema_Path() { assertThat(children_0_name().toSchemaPath().toString()).isEqualTo("children[].name"); assertThat(_0.toSchemaPath()).isEqualTo(_1.toSchemaPath()); assertThat(children_0().toSchemaPath()).isNotEqualTo(parents_0.toSchemaPath()); PropertyPath any = ROOT.anyIndex(); assertThat(any.toSchemaPath()).isSameAs(any); any = ROOT.anyKey(); assertThat(any.toSchemaPath()).isSameAs(any); } @Test public void asterisk() { assertThat(parse("map*.key")).isEqualTo(ROOT.property("map").any().property("key")); } @Test public void path() { PropertyPath path = parents_0.path(parents_1_name); assertThat(path.toString()).isEqualTo("parents[0].parents[1].name"); } @Test public void property_does_not_equal_key() { Property property = ROOT.property("property"); Key key = ROOT.key("property"); assertThat(property).isNotEqualTo(key); assertThat(key).isNotEqualTo(property); } @Test public void key_or_index() { assertThat(ROOT.keyOrIndex("key").getNodeId().isKey()).isTrue(); assertThat(ROOT.keyOrIndex(123).getNodeId().isIndex()).isTrue(); } @Test public void any_toString() { assertThat(ROOT.any().toString()).isEqualTo("*"); } @Test public void any_key_toString() { assertThat(ROOT.anyKey().toString()).isEqualTo("{}"); } @Test public void any_property_toString() { assertThat(ROOT.anyProperty().toString()).isEqualTo(".*"); } @Test public void index_id_toString() { assertThat(NodeId.index(567).toString()).isEqualTo("567"); } @Test public void root_with_parent() { Property path = ROOT.property("property"); assertThat(ROOT.withParent(path)).isEqualTo(path); } @Test public void key_with_parent() { PropertyPath key = ROOT.key("key"); assertThat(ROOT.path(key)).isEqualTo(key); } @Test public void name_of_any_property() { PropertyPath key = ROOT.anyProperty().property("name"); assertThat(ROOT.path(key)).isEqualTo(key); } @Test public void any_property_with_parent() { PropertyPath anyProperty = ROOT.anyProperty(); assertThat(ROOT.path(anyProperty)).isEqualTo(anyProperty); } @Test public void schema_path_of_key() { assertThat(ROOT.key("key").toSchemaPath()).isEqualTo(ROOT.anyKey()); } @Test public void schema_path_of_property() { assertThat(ROOT.property("property").toSchemaPath()).isEqualTo(ROOT.property("property")); } @Test public void schema_path_of_a_schema_path_is_the_same_path() { PropertyPath path = ROOT.property("list").index(123).key("key").property("property").toSchemaPath(); assertThat(path.toString()).isEqualTo("list[]{}.property"); assertThat(path.toSchemaPath()).isEqualTo(path); } @Test public void any_with_parent() { PropertyPath any = ROOT.any(); Property path = ROOT.property("property"); assertThat(path.path(any)).isEqualTo(path.any()); } @Test(expected = IllegalArgumentException.class) public void key_or_index_of_unsupported_type() { ROOT.keyOrIndex(new Object()); } @Test public void append_any() { assertThat(ROOT.node(NodeId.ANY)).isEqualTo(ROOT.any()); } @Test(expected = UnsupportedOperationException.class) public void get_index_of_any_index() { NodeId.ANY_INDEX.getIndex(); } @Test(expected = UnsupportedOperationException.class) public void get_key_of_any_key() { NodeId.ANY_KEY.getKey(); } @Test public void key_or_index_of_NodeId() { assertThat(NodeId.index(123).getKeyOrIndex()).isEqualTo(123l); assertThat(NodeId.keyOrIndex("key").getKeyOrIndex()).isEqualTo("key"); } @Test public void negative_long_index() { String str = PropertyPath.ROOT.property("numbers").index(MIN_VALUE).toString(); assertThat(str).isEqualTo("numbers[-9223372036854775808]"); PropertyPath path = PropertyPath.parse(str); assertThat(path.getNodeId()).isEqualTo(NodeId.index(-9223372036854775808l)); } @Test public void Full_Path() { List<SubPath> fullPath = children_0_name().getFullPath(); assertThat(fullPath).hasSize(3); assertThat(fullPath.get(0)).isEqualTo(children); assertThat(fullPath.get(1)).isEqualTo((PropertyPath) children_0()); } @Test public void construct_from_basic_nodes() { PropertyPath path = ROOT.property("property").key("key").index(1); testConstructionFromNodes(path); } @Test public void construct_from_special_nodes() { PropertyPath path = ROOT.anyProperty().anyKey().anyIndex().any(); testConstructionFromNodes(path); } @Test public void ecmascript_keys() { PropertyPath path = ROOT.property("map").key("a/b'c"); PropertyPath parsed = PropertyPath.parse(path.toString()); assertThat(parsed).isEqualTo(path); } private void testConstructionFromNodes(PropertyPath path) { PropertyPath nodePath = ROOT; for (SubPath element : path.asList()) { nodePath = nodePath.node(element.nodeId); } assertThat(nodePath).isEqualTo(path); assertThat(nodePath.toString()).isEqualTo(path.toString()); } @Test public void compare() { PropertyPath[] sorted = { parse("b.a"), parse("a[]"), parse("a{}"), parse("a.*"), parse("a*"), parse("a[2]"), parse("a[1]"), parse("a.b"), parse("a[\"b\"]"), parse("a[\"a\"]"), parse("a.a"), parse("[]"), parse("{}"), parse(".*"), parse("*"), parse("[2]"), parse("[1]"), parse("b"), parse("[\"b\"]"), parse("[\"a\"]"), parse("a") }; Arrays.sort(sorted); assertThat(asList(sorted)).isEqualTo(asList( parse("*"), parse("[]"), parse(".*"), parse("{}"), parse("[1]"), parse("[2]"), parse("a"), parse("a*"), parse("a[]"), parse("a.*"), parse("a{}"), parse("a[1]"), parse("a[2]"), parse("a.a"), parse("a.b"), parse("a[\"a\"]"), parse("a[\"b\"]"), parse("b"), parse("b.a"), parse("[\"a\"]"), parse("[\"b\"]") )); } public static PropertyPath _0 = ROOT.index(0); public static PropertyPath _1 = ROOT.index(1); public static PropertyPath _1_0 = _1.index(0); public static PropertyPath children = ROOT.property("children"); public static PropertyPath parents = ROOT.property("parents"); private static final PropertyPath parents_0 = parents.index(0); public static PropertyPath parents_0_name = parents_0.property("name"); public static PropertyPath parents_1_name = parents.index(1).property("name"); public static SubPath children_0() { return children.index(0); } public static SubPath children_0_name() { return children_0().property("name"); } }