/* * 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.brooklyn.util.collections; import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.brooklyn.util.collections.Jsonya; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.collections.Jsonya.Navigator; import org.testng.Assert; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; public class JsonyaTest { public static Navigator<MutableMap<Object,Object>> europeMap() { return Jsonya.newInstance().at("europe", "uk", "edinburgh") .put("population", 500*1000) .put("weather", "wet", "lighting", "dark") .root().at("europe").at("france").put("population", 80*1000*1000) .root(); } @SuppressWarnings("unchecked") @Test public void testJsonyaMapNew() { MutableMap<Object, Object> m = europeMap().getRootMap(); Assert.assertEquals(Jsonya.of(m).get("europe", "uk", "edinburgh", "population"), 500*1000); Assert.assertEquals(Jsonya.of(m).at("europe", "uk", "edinburgh", "population").get(), 500*1000); Assert.assertEquals(((Map<Object,Object>)Jsonya.of(m).get("europe")).keySet(), ImmutableSet.of("uk", "france")); Assert.assertEquals(Jsonya.of(m).at("europe").getFocusMap().keySet(), ImmutableSet.of("uk", "france")); } @SuppressWarnings("rawtypes") @Test public void testJsonyaMapExistingAndRootModification() { Navigator<MutableMap<Object, Object>> n = Jsonya.of(europeMap().getRootMap()).at("asia") .put(MutableMap.of("china", null)) .put(MutableMap.of("japan", null)); Assert.assertTrue( n.root().at("asia").get(Map.class).containsKey("china") ); Assert.assertTrue( ((Map)n.root().get("asia")).containsKey("japan") ); } @SuppressWarnings("rawtypes") @Test public void testJsonyaWithList() { Navigator<MutableMap<Object, Object>> n = europeMap(); n.at("europe", "uk", "neighbours").list().add("ireland") .root().at("europe", "france", "neighbours").list().add("spain", "germany").add("switzerland") .root().at("europe", "france", "neighbours").add("lux"); Object l = n.root().at("europe", "france", "neighbours").get(); Assert.assertTrue(l instanceof List); Assert.assertEquals(((List)l).size(), 4); // this wants a map, so it creates a map in the list n.put("east", "germany", "south", "spain"); Assert.assertEquals(((List)l).size(), 5); Map nd = (Map) ((List)l).get(4); Assert.assertEquals(nd.size(), 2); Map nd2 = (Map) n.root().get("europe", "france", "neighbours", 4); Assert.assertEquals(nd2.size(), 2); } @SuppressWarnings("rawtypes") @Test public void testCreateMapInList1() { MutableMap<Object, Object> map = Jsonya.at("countries").list().map().add("europe", "uk").getRootMap(); List l = (List)map.get("countries"); Assert.assertEquals( ((Map)l.get(0)).get("europe"), "uk" ); } @SuppressWarnings("rawtypes") @Test public void testCreateMapInList2() { MutableMap<Object, Object> map = Jsonya.at("countries").list().map().add("europe", "uk") .root().at("countries").add("antarctica") .root().at("countries").map().add("asia", (Object)null) .at("asia").list().add("china", "japan").getRootMap(); List l = (List)map.get("countries"); Assert.assertEquals( ((Map)l.get(0)).get("europe"), "uk" ); } @Test public void testJsonyaDeepSimple() { Navigator<MutableMap<Object, Object>> n = Jsonya.of(europeMap()) .at("europe").add("spain", "plains"); Assert.assertEquals( n.root().get("europe", "spain"), "plains" ); Assert.assertEquals( n.getRootMap().size(), 1 ); Assert.assertEquals( n.root().at("europe").getFocusMap().size(), 3 ); } @Test(expectedExceptions=Exception.class) public void testJsonyaDeepSimpleFailure() { Jsonya.of(europeMap()).at("euroope").add("spain"); } @Test public void testJsonyaDeepMoreComplicated() { Navigator<MutableMap<Object, Object>> n = Jsonya.of(europeMap()).at("asia") .list().add("china", "japan") .root().add( Jsonya.newInstance().at("europe", "uk", "glasgow").put("weather", "even wetter").getRootMap() ); Assert.assertEquals( n.getRootMap().size(), 2 ); Assert.assertTrue( n.root().at("asia").get(List.class).contains("china") ); Assert.assertTrue( ((List<?>)n.root().get("asia")).contains("japan") ); Assert.assertEquals(n.root().at("europe", "uk").get(Map.class).size(), 2); Assert.assertEquals(n.root().at("europe", "uk", "edinburgh", "weather").get(), "wet"); Assert.assertEquals(n.root().at("europe", "uk", "glasgow", "weather").get(), "even wetter"); } @Test public void testJsonyaToString() { Assert.assertEquals(europeMap().toString(), "{ \"europe\": { \"uk\": { \"edinburgh\": { \"population\": 500000, \"weather\": \"wet\", \"lighting\": \"dark\" } }," + " \"france\": { \"population\": 80000000 } } }"); } @Test public void testPrimitivedAndLiteralledMap() { Object foo = new Object() { public String toString() { return "FOO"; } }; MutableMap<Object, Object> map = MutableMap.<Object,Object>of("a", 1, 2, Arrays.<Object>asList(true, 8, "8"), 'C', foo); Map<Object, Object> mapL = Jsonya.newInstanceLiteral().put(map).getRootMap(); Assert.assertEquals(mapL, map); Assert.assertEquals(mapL.get('C'), foo); Map<Object, Object> mapP = Jsonya.newInstancePrimitive().put(map).getRootMap(); Assert.assertNotEquals(mapP, map); Assert.assertEquals(mapP.get('C'), foo.toString()); Assert.assertEquals(MutableMap.copyOf(mapP).add('C', null), MutableMap.copyOf(map).add('C', null)); } @Test public void testJsonyaBadPathNull() { Navigator<MutableMap<Object, Object>> m = europeMap(); // does not create (but if we 'pushed' it would) Assert.assertNull( m.at("europe", "spain", "barcelona").get() ); Assert.assertNull( m.root().at("europe").at("spain").at("barcelona").get() ); } @Test public void testJsonyaMaybe() { Navigator<MutableMap<Object, Object>> m = europeMap(); Assert.assertEquals( m.at("europe", "spain", "barcelona").getMaybe().or("norealabc"), "norealabc" ); Assert.assertEquals(m.root().at("europe").getFocusMap().keySet(), MutableSet.of("uk", "france")); } @Test public void testJsonyaPushPop() { Navigator<MutableMap<Object, Object>> m = europeMap(); Assert.assertTrue(m.getFocusMap().containsKey("europe")); Assert.assertFalse(m.getFocusMap().containsKey("edinburgh")); m.push(); m.at("europe", "uk"); Assert.assertTrue(m.getFocusMap().containsKey("edinburgh")); Assert.assertFalse(m.getFocusMap().containsKey("europe")); m.pop(); Assert.assertTrue(m.getFocusMap().containsKey("europe")); Assert.assertFalse(m.getFocusMap().containsKey("edinburgh")); // also check 'get' does not change focus m.get("europe", "uk"); Assert.assertTrue(m.getFocusMap().containsKey("europe")); Assert.assertFalse(m.getFocusMap().containsKey("edinburgh")); } }