package com.jayway.jsonpath.old.internal; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.internal.path.PathCompiler; import org.junit.Test; import java.util.List; import static com.jayway.jsonpath.JsonPath.read; import static org.assertj.core.api.Assertions.assertThat; public class ScanPathTokenTest { public final static Object DOCUMENT = Configuration.defaultConfiguration().jsonProvider().parse( "{\n" + " \"store\":{\n" + " \"book\":[\n" + " {\n" + " \"category\":\"reference\",\n" + " \"author\":\"Nigel Rees\",\n" + " \"title\":\"Sayings of the Century\",\n" + " \"price\":8.95,\n" + " \"address\":{ " + " \"street\":\"fleet street\",\n" + " \"city\":\"London\"\n" + " }\n" + " },\n" + " {\n" + " \"category\":\"fiction\",\n" + " \"author\":\"Evelyn Waugh\",\n" + " \"title\":\"Sword of Honour\",\n" + " \"price\":12.9,\n" + " \"address\":{ \n" + " \"street\":\"Baker street\",\n" + " \"city\":\"London\"\n" + " }\n" + " },\n" + " {\n" + " \"category\":\"fiction\",\n" + " \"author\":\"J. R. R. Tolkien\",\n" + " \"title\":\"The Lord of the Rings\",\n" + " \"isbn\":\"0-395-19395-8\",\n" + " \"price\":22.99," + " \"address\":{ " + " \"street\":\"Svea gatan\",\n" + " \"city\":\"Stockholm\"\n" + " }\n" + " }\n" + " ],\n" + " \"bicycle\":{\n" + " \"color\":\"red\",\n" + " \"price\":19.95," + " \"address\":{ " + " \"street\":\"Söder gatan\",\n" + " \"city\":\"Stockholm\"\n" + " },\n" + " \"items\": [[\"A\",\"B\",\"C\"],1,2,3,4,5]\n" + " }\n" + " }\n" + "}" ); public final static Object DOCUMENT2 = Configuration.defaultConfiguration().jsonProvider().parse( "{\n" + " \"firstName\": \"John\",\n" + " \"lastName\" : \"doe\",\n" + " \"age\" : 26,\n" + " \"address\" :\n" + " {\n" + " \"streetAddress\": \"naist street\",\n" + " \"city\" : \"Nara\",\n" + " \"postalCode\" : \"630-0192\"\n" + " },\n" + " \"phoneNumbers\":\n" + " [\n" + " {\n" + " \"type\" : \"iPhone\",\n" + " \"number\": \"0123-4567-8888\"\n" + " },\n" + " {\n" + " \"type\" : \"home\",\n" + " \"number\": \"0123-4567-8910\"\n" + " }\n" + " ]\n" + " }" ); @Test public void a_document_can_be_scanned_for_property() { List<String> result = read(DOCUMENT, "$..author"); assertThat(result).containsOnly("Nigel Rees", "Evelyn Waugh", "J. R. R. Tolkien"); } @Test public void a_document_can_be_scanned_for_property_path() { List<String> result = read(DOCUMENT, "$..address.street"); assertThat(result).containsOnly("fleet street", "Baker street", "Svea gatan", "Söder gatan"); } @Test public void a_document_can_be_scanned_for_wildcard() { List<String> result = PathCompiler.compile("$..[*]").evaluate(DOCUMENT, DOCUMENT, Configuration.defaultConfiguration()).getPathList(); assertThat(result).containsOnly( "$['store']", "$['store']['bicycle']", "$['store']['book']", "$['store']['bicycle']['address']", "$['store']['bicycle']['color']", "$['store']['bicycle']['price']", "$['store']['bicycle']['items']", "$['store']['bicycle']['address']['city']", "$['store']['bicycle']['address']['street']", "$['store']['bicycle']['items'][0]", "$['store']['bicycle']['items'][1]", "$['store']['bicycle']['items'][2]", "$['store']['bicycle']['items'][3]", "$['store']['bicycle']['items'][4]", "$['store']['bicycle']['items'][5]", "$['store']['bicycle']['items'][0][0]", "$['store']['bicycle']['items'][0][1]", "$['store']['bicycle']['items'][0][2]", "$['store']['book'][0]", "$['store']['book'][1]", "$['store']['book'][2]", "$['store']['book'][0]['address']", "$['store']['book'][0]['author']", "$['store']['book'][0]['price']", "$['store']['book'][0]['category']", "$['store']['book'][0]['title']", "$['store']['book'][0]['address']['city']", "$['store']['book'][0]['address']['street']", "$['store']['book'][1]['address']", "$['store']['book'][1]['author']", "$['store']['book'][1]['price']", "$['store']['book'][1]['category']", "$['store']['book'][1]['title']", "$['store']['book'][1]['address']['city']", "$['store']['book'][1]['address']['street']", "$['store']['book'][2]['address']", "$['store']['book'][2]['author']", "$['store']['book'][2]['price']", "$['store']['book'][2]['isbn']", "$['store']['book'][2]['category']", "$['store']['book'][2]['title']", "$['store']['book'][2]['address']['city']", "$['store']['book'][2]['address']['street']"); } @Test public void a_document_can_be_scanned_for_wildcard2() { List<String> result = PathCompiler.compile("$.store.book[0]..*").evaluate(DOCUMENT, DOCUMENT, Configuration.defaultConfiguration()).getPathList(); assertThat(result).containsOnly( "$['store']['book'][0]['address']", "$['store']['book'][0]['author']", "$['store']['book'][0]['price']", "$['store']['book'][0]['category']", "$['store']['book'][0]['title']", "$['store']['book'][0]['address']['city']", "$['store']['book'][0]['address']['street']"); } @Test public void a_document_can_be_scanned_for_wildcard3() { List<String> result = PathCompiler.compile("$.phoneNumbers[0]..*").evaluate(DOCUMENT2, DOCUMENT, Configuration.defaultConfiguration()).getPathList(); assertThat(result).containsOnly( "$['phoneNumbers'][0]['number']", "$['phoneNumbers'][0]['type']"); } @Test public void a_document_can_be_scanned_for_predicate_match() { List<String> result = PathCompiler.compile("$..[?(@.address.city == 'Stockholm')]").evaluate(DOCUMENT, DOCUMENT, Configuration.defaultConfiguration()).getPathList(); assertThat(result).containsOnly( "$['store']['bicycle']", "$['store']['book'][2]"); } @Test public void a_document_can_be_scanned_for_existence() { List<String> result = PathCompiler.compile("$..[?(@.isbn)]").evaluate(DOCUMENT, DOCUMENT, Configuration.defaultConfiguration()).getPathList(); assertThat(result).containsOnly( "$['store']['book'][2]"); } }