diff --git a/pom.xml b/pom.xml index 41dc180198aa8d056c1dc20bdf837abc8627bc83..8d72ee07c8ca3abdb6ce6f163558e375d22018d5 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ org.opengroup.osdu os-core-common - 0.11.0-SNAPSHOT + 0.12.0-SNAPSHOT jar diff --git a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java index 78de924cf6f91f5dfc30f8041541c6b33a5329fb..5be18963cfe9967a7f4949fc1a0566f68dc35bb7 100644 --- a/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java +++ b/src/main/java/org/opengroup/osdu/core/common/crs/UnitConversionImpl.java @@ -197,13 +197,15 @@ public class UnitConversionImpl { } private String constructPropertyName(String name, int index) { - if (!name.contains("[")) { - return name; - } else { + String[] nestedNames = splitJsonPropertiesByDots(name); + + if (name.contains("[") && isNestedArrayElementHomogeneous(nestedNames[0])) { String target = name.substring(name.indexOf("["), name.indexOf("]") + 1); String position = "[" + index + "]"; String result = name.replace(target, position); return result; + } else { + return name; } } } diff --git a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java index 4633382c03bf8fc6f5217240f0612f43afc855c4..7d82c920b3143397a2a76b44810e6d4497e2ef89 100644 --- a/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java +++ b/src/main/java/org/opengroup/osdu/core/common/util/JsonUtils.java @@ -48,24 +48,40 @@ public class JsonUtils { * @return JsonElement list with property, if it found and null if not */ public static List getJsonPropertyValueFromJsonObject(String propertyName, JsonObject jsonObject) { - List result = new ArrayList<>(); String[] propertiesHierarchy = splitJsonPropertiesByDots(propertyName); - if (propertiesHierarchy[0].endsWith(PN_END)) { + if (propertiesHierarchy[0].endsWith(PN_END) && isNestedArrayElementHomogeneous(propertiesHierarchy[0])) { return getNestedJsonPropertyValueFromJsonObject(propertiesHierarchy, jsonObject); + } else if (propertiesHierarchy[0].endsWith(PN_END)) { + return getOneNestedJsonProperyValueFromJsonObject(propertiesHierarchy, jsonObject); } + List result = new ArrayList<>(); result.add(getNestedJsonElement(propertiesHierarchy, jsonObject)); return result; } - private static List getNestedJsonPropertyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { + private static List getOneNestedJsonProperyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { List result = new ArrayList<>(); + String[] innerNestedNames = getInnerNestedPropertyNames(propertyNestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(propertyNestedNames[0])) ; + int elementIndex = getNestedArrayElementIndex(propertyNestedNames[0]); + + if (elementIndex < 0 || elementIndex >= elementArray.size()) { + result.add(null); + } else { + JsonElement element = getNestedJsonElement(innerNestedNames, elementArray.get(elementIndex).getAsJsonObject()); + result.add(element); + } - String[] innerNestedNames = new String[propertyNestedNames.length - 1]; - System.arraycopy(propertyNestedNames, 1, innerNestedNames, 0, propertyNestedNames.length - 1); + return result; + } - JsonArray elementArray = jsonObject.getAsJsonArray(propertyNestedNames[0].substring(0, propertyNestedNames[0].length() - 2 )) ; + private static List getNestedJsonPropertyValueFromJsonObject(String[] propertyNestedNames, JsonObject jsonObject) { + List result = new ArrayList<>(); + + String[] innerNestedNames = getInnerNestedPropertyNames(propertyNestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(propertyNestedNames[0])) ; for (int i = 0; i < elementArray.size(); i++) { JsonObject element = elementArray.get(i).getAsJsonObject(); @@ -122,9 +138,12 @@ public class JsonUtils { public static void overrideNumberPropertyOfJsonObject(String propertyName, List value, JsonObject jsonObject) { String[] nestedNames = splitJsonPropertiesByDots(propertyName); - if (nestedNames[0].endsWith(PN_END)) { + if (nestedNames[0].endsWith(PN_END) && isNestedArrayElementHomogeneous(nestedNames[0])) { overrideNestedNumberPropertyOfJsonObject(nestedNames, value, jsonObject); return; + } else if (nestedNames[0].endsWith(PN_END)) { + overrideOneNestedNumberPorpertyOfJsonObject(nestedNames, value, jsonObject); + return; } JsonObject targetJsonObject = buildNewJsonObject(nestedNames, jsonObject); @@ -133,10 +152,26 @@ public class JsonUtils { .ifPresent(json -> json.addProperty(nestedNames[nestedNames.length - 1], value.get(0))); } + private static void overrideOneNestedNumberPorpertyOfJsonObject(String[] nestedNames, List values, JsonObject jsonObject) { + String[] innerNestedNames = getInnerNestedPropertyNames(nestedNames); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; + int elementIndex = getNestedArrayElementIndex(nestedNames[0]); + + if (elementIndex < 0 || elementIndex >= elementArray.size()) { + return; + } + + JsonObject element = elementArray.get(elementIndex).getAsJsonObject(); + JsonObject targetJsonObject = buildNewJsonObject(innerNestedNames, element); + + if (targetJsonObject != null) { + targetJsonObject.addProperty(innerNestedNames[innerNestedNames.length - 1], values.get(0)); + } + } + private static void overrideNestedNumberPropertyOfJsonObject(String[] nestedNames, List values, JsonObject jsonObject) { - JsonArray elementArray = jsonObject.getAsJsonArray(nestedNames[0].substring(0, nestedNames[0].length() - 2 )) ; - String[] innerNestedNames = new String[nestedNames.length - 1]; - System.arraycopy(nestedNames, 1, innerNestedNames, 0, nestedNames.length - 1); + JsonArray elementArray = jsonObject.getAsJsonArray(getNestedJsonArrayName(nestedNames[0])) ; + String[] innerNestedNames = getInnerNestedPropertyNames(nestedNames); for (int i = 0; i < elementArray.size(); i++) { JsonObject element = elementArray.get(i).getAsJsonObject(); @@ -186,4 +221,36 @@ public class JsonUtils { if(name == null) return null; return name.split("\\."); } + + public static boolean isNestedArrayElementHomogeneous(String nestedArrayName) { + int openIndex = nestedArrayName.indexOf("["); + return openIndex == nestedArrayName.length() - 2; + } + + public static String[] getInnerNestedPropertyNames(String[] nestedPropertyNames) { + String[] innerNestedNames = new String[nestedPropertyNames.length - 1]; + System.arraycopy(nestedPropertyNames, 1, innerNestedNames, 0, nestedPropertyNames.length - 1); + + return innerNestedNames; + } + + public static String getNestedJsonArrayName(String nestedArrayName) { + int openIndex = nestedArrayName.indexOf("["); + return nestedArrayName.substring(0, openIndex); + } + + public static int getNestedArrayElementIndex(String itemNameWithIndex) { + int openIndex = itemNameWithIndex.indexOf("[") + 1; + int closeIndex = itemNameWithIndex.indexOf("]"); + String indexString = itemNameWithIndex.substring(openIndex, closeIndex); + + int index; + try { + index = Integer.parseInt(indexString); + } catch (Exception e) { + index = -1; + } + + return index; + } } \ No newline at end of file diff --git a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java index 86f1e588e21f2b3984887399eb4f0729e927cb6d..17eb3f79109115c6f4a485666f52e9a675e7359a 100644 --- a/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java +++ b/src/test/java/org/opengroup/osdu/core/common/crs/UnitConversionTests.java @@ -404,6 +404,76 @@ public class UnitConversionTests { Assert.assertEquals(record, resultRecord); } + @Test + public void shouldReturnUpdatedRecordWhenDataContainsValidInhomogeneousNestedArrayProperties() { + JsonObject record = testData.getAsJsonObject("inhomogeneousNestedArrayPropertyIsValid"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + JsonObject meta = (JsonObject) metaArray.get(0); + String persistableReference = meta.get("persistableReference").getAsString(); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConversionMessages().size() == 0); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + JsonElement data = resultRecord.get("data"); + JsonArray markers = data.getAsJsonObject().getAsJsonArray("markers"); + JsonObject item1 = markers.get(0).getAsJsonObject(); + double actualConvertedMeasuredDepthValue1 = item1.get("measuredDepth").getAsDouble(); + Assert.assertEquals(10.0, actualConvertedMeasuredDepthValue1, 0.00001); + JsonObject item2 = markers.get(1).getAsJsonObject(); + double actualConvertedMeasuredDepthValue2 = item2.get("measuredDepth").getAsDouble(); + Assert.assertEquals(6.096, actualConvertedMeasuredDepthValue2, 0.00001); + JsonArray resultMetaArray = resultRecord.getAsJsonArray("meta"); + Assert.assertEquals(1, resultMetaArray.size()); + JsonObject resultMeta = (JsonObject) resultMetaArray.get(0); + String resultPersistableReference = resultMeta.get("persistableReference").getAsString(); + Assert.assertTrue(persistableReference != resultPersistableReference); + String resultName = resultMeta.get("name").getAsString(); + Assert.assertEquals("m", resultName); + } + + @Test + public void shouldReturnOriginalRecordWhenInhomogeneousNestedArrayPropertyValueTypeIsInvalidInDataAndNested() { + JsonObject record = testData.getAsJsonObject("inhomogeneousNestedArrayPropertyWithInvalidDataType"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecord.setConvertStatus(ConvertStatus.SUCCESS); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConvertStatus() == ConvertStatus.ERROR); + String message = String.format(UnitConversionImpl.ILLEGAL_PROPERTY_VALUE, "markers[2].measuredDepth"); + Assert.assertEquals(message, conversionRecords.get(0).getConversionMessages().get(0)); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + Assert.assertEquals(record, resultRecord); + } + + @Test + public void shouldReturnOriginalRecordWhenInhomogeneousNestedArrayPropertyValueIndexOutOfBoundary() { + JsonObject record = testData.getAsJsonObject("inhomogeneousPropertyIndexOutOfBoundary"); + JsonArray metaArray = record.getAsJsonArray("meta"); + Assert.assertEquals(1, metaArray.size()); + List conversionRecords = new ArrayList<>(); + ConversionRecord conversionRecord = new ConversionRecord(); + conversionRecord.setRecordJsonObject(record); + conversionRecord.setConvertStatus(ConvertStatus.SUCCESS); + conversionRecords.add(conversionRecord); + this.unitConversion.convertUnitsToSI(conversionRecords); + Assert.assertEquals(1, conversionRecords.size()); + Assert.assertTrue(conversionRecords.get(0).getConvertStatus() == ConvertStatus.SUCCESS); + String message = String.format(UnitConversionImpl.MISSING_PROPERTY, "markers[2].measuredDepth"); + Assert.assertEquals(message, conversionRecords.get(0).getConversionMessages().get(0)); + JsonObject resultRecord = conversionRecords.get(0).getRecordJsonObject(); + Assert.assertEquals(record, resultRecord); + } + private JsonObject getTestData() { InputStream inStream = this.getClass().getResourceAsStream("/testdata/nested-data.json"); BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); diff --git a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java index 7fdaa157ffbedb9b3fab6c9d14343d9d56edcd5e..37647d618fdb3407775b2c3a5e72c37dc915b9ec 100644 --- a/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java +++ b/src/test/java/org/opengroup/osdu/core/common/model/units/JsonUtilsTest.java @@ -181,6 +181,50 @@ public class JsonUtilsTest { assertNull(result.get(2)); } + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfProperty_whenOneOfNestedArrayItemsPropertyPresented() { + String propertyName = "markers[1].value"; + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + when(mockJsonObject.get("value")).thenReturn(mockJsonPrimitive); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(1)).get("value"); + assertSame(mockJsonPrimitive, result.get(0)); + } + + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfNull_whenOneOfNestedArrayItemsPropertyNotPresented() { + String propertyName = "markers[1].value"; + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(1)).get("value"); + assertNull(result.get(0)); + } + + @Test + public void getJsonPropertyValueFromJsonObject_shouldReturnListOfNull_whenNextedArrayItemIndexExceedsBoundary() { + String propertyName = "markers[2].value"; + + setupJsonArrayMock(1); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + when(mockJsonObject.get("value")).thenReturn(mockJsonPrimitive); + + List result = getJsonPropertyValueFromJsonObject(propertyName, mockJsonObject); + + assertEquals(1, result.size()); + verify(mockJsonObject, times(0)).get("value"); + assertNull(result.get(0)); + } + // ---- JsonUtils.isJsonPropertyPresentedInJsonObject tests ---- @Test @@ -281,6 +325,34 @@ public class JsonUtilsTest { verify(mockJsonObject, times(1)).addProperty("value", 32); } + @Test + public void overrideOneNumberPropertyOfJsonObject_succeed_whenJsonObjectPresentedInNestedArray() { + String propertyName = "markers[1].value"; + Integer value1 = 12; + List values = new ArrayList<>(); + values.add(value1); + + setupJsonArrayMock(3); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + overrideNumberPropertyOfJsonObject(propertyName, values, mockJsonObject); + verify(mockJsonObject, times(1)).addProperty("value", 12); + } + + @Test + public void overrideNumberPropertyOfJsonObject_notHappened_whenJsonObjectIndexOutOfBoundary() { + String propertyName = "markers[1].value"; + Integer value1 = 12; + List values = new ArrayList<>(); + values.add(value1); + + setupJsonArrayMock(1); + when(mockJsonObject.getAsJsonArray("markers")).thenReturn(mockJsonArray); + + overrideNumberPropertyOfJsonObject(propertyName, values, mockJsonObject); + verify(mockJsonObject, never()).addProperty(anyString(), any(Number.class)); + } + // ---- JsonUtils.overrideStringPropertyOfJsonObject tests ---- @Test diff --git a/src/test/resources/testdata/nested-data.json b/src/test/resources/testdata/nested-data.json index 65661be6113e8d862eca53c59ce54b8d9b163b22..12111cd19257551e7fc4ccd96d56a5c98a1a5624 100644 --- a/src/test/resources/testdata/nested-data.json +++ b/src/test/resources/testdata/nested-data.json @@ -17,7 +17,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -44,7 +44,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -71,7 +71,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "markers[].measuredDepth" ], @@ -94,7 +94,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "depth.inner.value" ], @@ -143,7 +143,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD.value" ], @@ -163,7 +163,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD.value" ], @@ -181,7 +181,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -199,7 +199,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -217,7 +217,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -235,7 +235,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -253,7 +253,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": "MD", "name": "ft" } @@ -268,7 +268,7 @@ "meta": [ { "path": "", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "propertyNames": [ "MD" ], @@ -286,7 +286,7 @@ { "path": "", "kind": "UNIT", - "persistableReference": "%7B%22ScaleOffset%22%3A%7B%22Scale%22%3A0.3048%2C%22Offset%22%3A0.0%7D%2C%22Symbol%22%3A%22ft%22%2C%22BaseMeasurement%22%3A%22%257B%2522Ancestry%2522%253A%2522Length%2522%257D%22%7D", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", "name": "ft" } ] @@ -390,5 +390,90 @@ "Y": 10.00, "Z": 0 } + }, + "inhomogeneousNestedArrayPropertyIsValid": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", + "propertyNames": [ + "markers[1].measuredDepth" + ], + "name": "ft" + } + ] + }, + "inhomogeneousNestedArrayPropertyWithInvalidDataType": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + }, + { + "measuredDepth": "invalidType", + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", + "propertyNames": [ + "markers[2].measuredDepth" + ], + "name": "ft" + } + ] + }, + "inhomogeneousPropertyIndexOutOfBoundary": { + "id": "unit-test-1", + "kind": "unit:test:1.0.0", + "data": { + "markers": [ + { + "measuredDepth": 10.0, + "testField": "test" + }, + { + "measuredDepth": 20.0, + "testField": "test" + } + ] + }, + "meta": [ + { + "path": "", + "kind": "UNIT", + "persistableReference": "{\"abcd\":{\"a\":0.0,\"b\":0.3048,\"c\":1.0,\"d\":0.0},\"symbol\":\"ft\",\"baseMeasurement\":{\"ancestry\":\"L\",\"type\":\"UM\"},\"type\":\"UAD\"}", + "propertyNames": [ + "markers[2].measuredDepth" + ], + "name": "ft" + } + ] } } \ No newline at end of file