blob: 8e7b3f2cc934a8f50d9ff5430c4ec7ba5ac05071 [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.brooklyn.feed.http;
import java.lang.reflect.Array;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import com.google.common.reflect.TypeToken;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.collections.Jsonya;
import org.apache.brooklyn.util.collections.Jsonya.Navigator;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.guava.Functionals;
import org.apache.brooklyn.util.guava.Maybe;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.jayway.jsonpath.PathNotFoundException;
public class JsonFunctionsTest {
public static JsonElement europeMap() {
Navigator<MutableMap<Object, Object>> europe = 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();
return new JsonParser().parse( europe.toString() );
}
@Test
public void testAsJson() {
JsonElement jsonElement = europeMap();
String jsonString = jsonElement.toString();
JsonElement result = JsonFunctions.asJson().apply(jsonString);
Assert.assertEquals(result.toString(), jsonString);
}
@Test
public void testAsJsonWithNullReturnsNull() {
Assert.assertNull(JsonFunctions.asJson().apply(null));
}
@Test
public void testWalk1() {
JsonElement pop = JsonFunctions.walk("europe", "france", "population").apply(europeMap());
Assert.assertEquals( (int)JsonFunctions.cast(Integer.class).apply(pop), 80*1000*1000 );
}
@Test
public void testWalk2() {
String weather = Functionals.chain(
JsonFunctions.walk("europe.uk.edinburgh.weather"),
JsonFunctions.cast(String.class) ).apply(europeMap());
Assert.assertEquals(weather, "wet");
}
@Test(expectedExceptions=NoSuchElementException.class)
public void testWalkWrong() {
Functionals.chain(
JsonFunctions.walk("europe", "spain", "barcelona"),
JsonFunctions.cast(String.class) ).apply(europeMap());
}
@Test
public void testWalkM() {
Maybe<JsonElement> pop = JsonFunctions.walkM("europe", "france", "population").apply( Maybe.of(europeMap()) );
Assert.assertEquals( (int)JsonFunctions.castM(Integer.class).apply(pop), 80*1000*1000 );
}
@Test
public void testWalkMWrong1() {
Maybe<JsonElement> m = JsonFunctions.walkM("europe", "spain", "barcelona").apply( Maybe.of( europeMap()) );
Assert.assertTrue(m.isAbsent());
}
@Test(expectedExceptions=IllegalStateException.class)
public void testCastMWhenAbsent() {
// Maybe<JsonElement> m = JsonFunctions.walkM("europe", "spain", "barcelona").apply( Maybe.of( europeMap()) );
Maybe<JsonElement> m = Maybe.absent();
JsonFunctions.castM(String.class).apply(m);
}
@Test(expectedExceptions=UnsupportedOperationException.class)
public void testCastMWrong() {
Maybe<JsonElement> m = JsonFunctions.walkM("europe", "france").apply( Maybe.of( europeMap()) );
JsonFunctions.castM(String.class).apply(m);
}
@Test
public void testCastCollectionsAndMaps() {
Asserts.assertEquals(JsonFunctions.doCast(JsonParser.parseString("[1,2,3]"), (new Integer[]{}).getClass()), new Integer[] { 1, 2, 3 });
Asserts.assertEquals(JsonFunctions.doCast(JsonParser.parseString("[1,2,3]"), new TypeToken<List<Integer>>() {}), MutableList.of(1, 2, 3));
Asserts.assertEquals(JsonFunctions.doCast(JsonParser.parseString("[1,2,3]"), JsonElement.class), JsonParser.parseString("[1,2,3]"));
Asserts.assertEquals(JsonFunctions.doCast(JsonParser.parseString("{ \"a\": 1 }"), new TypeToken<Map<String,Integer>>() {}), MutableMap.of("a", 1));
Asserts.assertEquals(JsonFunctions.doCast(JsonParser.parseString("{ \"a\": 1 }"), Object.class), MutableMap.of("a", 1));
}
@Test
public void testWalkN() {
JsonElement pop = JsonFunctions.walkN("europe", "france", "population").apply( europeMap() );
Assert.assertEquals( (int)JsonFunctions.cast(Integer.class).apply(pop), 80*1000*1000 );
}
@Test
public void testWalkNWrong1() {
JsonElement m = JsonFunctions.walkN("europe", "spain", "barcelona").apply( europeMap() );
Assert.assertNull(m);
}
public void testWalkNWrong2() {
JsonElement m = JsonFunctions.walkN("europe", "spain", "barcelona").apply( europeMap() );
String n = JsonFunctions.cast(String.class).apply(m);
Assert.assertNull(n);
}
@Test
public void testGetPath1(){
Integer obj = (Integer) JsonFunctions.getPath("$.europe.uk.edinburgh.population").apply(europeMap());
Assert.assertEquals((int) obj, 500*1000);
}
@Test
public void testGetPath2(){
String obj = (String) JsonFunctions.getPath("$.europe.uk.edinburgh.lighting").apply(europeMap());
Assert.assertEquals(obj, "dark");
}
@Test
public void testGetPathWithNullReturnsNull(){
Integer obj = (Integer) JsonFunctions.getPath("$.europe.uk.edinburgh.population").apply(null);
Assert.assertNull(obj);
}
@Test
public void testGetPathSizeOfMap(){
JsonElement json = JsonFunctions.asJson().apply("{\"mymap\": {\"k1\": \"v1\", \"k2\": \"v2\"}}");
Integer obj = (Integer) JsonFunctions.getPath("$.mymap.size()").apply(json);
Assert.assertEquals(obj, (Integer)2);
}
@Test
public void testGetPathSizeOfList(){
JsonElement json = JsonFunctions.asJson().apply("{\"mylist\": [\"a\", \"b\", \"c\"]}");
Integer obj = (Integer) JsonFunctions.getPath("$.mylist.size()").apply(json);
Assert.assertEquals(obj, (Integer)3);
}
@Test
public void testGetMissingPathIsNullOrThrows(){
try {
// TODO is there a way to force this to return null if not found?
// for me (Alex) it throws but for others it seems to return null
Object obj = JsonFunctions.getPath("$.europe.spain.malaga").apply(europeMap());
Assert.assertNull(obj);
} catch (PathNotFoundException e) {
// not unexpected
}
}
}