| /* |
| * Copyright 2020 The Android Open Source Project |
| * |
| * 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 androidx.appsearch.app.cts; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import static org.junit.Assert.assertThrows; |
| |
| import androidx.appsearch.app.GenericDocument; |
| |
| import org.junit.Test; |
| |
| public class GenericDocumentCtsTest { |
| private static final byte[] sByteArray1 = new byte[]{(byte) 1, (byte) 2, (byte) 3}; |
| private static final byte[] sByteArray2 = new byte[]{(byte) 4, (byte) 5, (byte) 6, (byte) 7}; |
| private static final GenericDocument sDocumentProperties1 = new GenericDocument |
| .Builder<>("sDocumentProperties1", "sDocumentPropertiesSchemaType1") |
| .setCreationTimestampMillis(12345L) |
| .build(); |
| private static final GenericDocument sDocumentProperties2 = new GenericDocument |
| .Builder<>("sDocumentProperties2", "sDocumentPropertiesSchemaType2") |
| .setCreationTimestampMillis(6789L) |
| .build(); |
| |
| @Test |
| public void testDocumentEquals_identical() { |
| GenericDocument document1 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setTtlMillis(1L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .build(); |
| GenericDocument document2 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setTtlMillis(1L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .build(); |
| assertThat(document1).isEqualTo(document2); |
| assertThat(document1.hashCode()).isEqualTo(document2.hashCode()); |
| } |
| |
| @Test |
| public void testDocumentEquals_differentOrder() { |
| GenericDocument document1 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .build(); |
| |
| // Create second document with same parameter but different order. |
| GenericDocument document2 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .build(); |
| assertThat(document1).isEqualTo(document2); |
| assertThat(document1.hashCode()).isEqualTo(document2.hashCode()); |
| } |
| |
| @Test |
| public void testDocumentEquals_failure() { |
| GenericDocument document1 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .build(); |
| |
| // Create second document with same order but different value. |
| GenericDocument document2 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyLong("longKey1", 1L, 2L, 4L) // Different |
| .build(); |
| assertThat(document1).isNotEqualTo(document2); |
| assertThat(document1.hashCode()).isNotEqualTo(document2.hashCode()); |
| } |
| |
| @Test |
| public void testDocumentEquals_repeatedFieldOrder_failure() { |
| GenericDocument document1 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .build(); |
| |
| // Create second document with same order but different value. |
| GenericDocument document2 = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyBoolean("booleanKey1", true, true, false) // Different |
| .build(); |
| assertThat(document1).isNotEqualTo(document2); |
| assertThat(document1.hashCode()).isNotEqualTo(document2.hashCode()); |
| } |
| |
| @Test |
| public void testDocumentGetSingleValue() { |
| GenericDocument document = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setScore(1) |
| .setTtlMillis(1L) |
| .setPropertyLong("longKey1", 1L) |
| .setPropertyDouble("doubleKey1", 1.0) |
| .setPropertyBoolean("booleanKey1", true) |
| .setPropertyString("stringKey1", "test-value1") |
| .setPropertyBytes("byteKey1", sByteArray1) |
| .setPropertyDocument("documentKey1", sDocumentProperties1) |
| .build(); |
| assertThat(document.getUri()).isEqualTo("uri1"); |
| assertThat(document.getTtlMillis()).isEqualTo(1L); |
| assertThat(document.getSchemaType()).isEqualTo("schemaType1"); |
| assertThat(document.getCreationTimestampMillis()).isEqualTo(5); |
| assertThat(document.getScore()).isEqualTo(1); |
| assertThat(document.getPropertyLong("longKey1")).isEqualTo(1L); |
| assertThat(document.getPropertyDouble("doubleKey1")).isEqualTo(1.0); |
| assertThat(document.getPropertyBoolean("booleanKey1")).isTrue(); |
| assertThat(document.getPropertyString("stringKey1")).isEqualTo("test-value1"); |
| assertThat(document.getPropertyBytes("byteKey1")) |
| .asList().containsExactly((byte) 1, (byte) 2, (byte) 3); |
| assertThat(document.getPropertyDocument("documentKey1")).isEqualTo(sDocumentProperties1); |
| } |
| |
| @Test |
| public void testDocumentGetArrayValues() { |
| GenericDocument document = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .build(); |
| |
| assertThat(document.getUri()).isEqualTo("uri1"); |
| assertThat(document.getSchemaType()).isEqualTo("schemaType1"); |
| assertThat(document.getPropertyLongArray("longKey1")).asList().containsExactly(1L, 2L, 3L); |
| assertThat(document.getPropertyDoubleArray("doubleKey1")).usingExactEquality() |
| .containsExactly(1.0, 2.0, 3.0); |
| assertThat(document.getPropertyBooleanArray("booleanKey1")).asList() |
| .containsExactly(true, false, true); |
| assertThat(document.getPropertyStringArray("stringKey1")).asList() |
| .containsExactly("test-value1", "test-value2", "test-value3"); |
| assertThat(document.getPropertyBytesArray("byteKey1")).asList() |
| .containsExactly(sByteArray1, sByteArray2); |
| assertThat(document.getPropertyDocumentArray("documentKey1")).asList() |
| .containsExactly(sDocumentProperties1, sDocumentProperties2); |
| } |
| |
| @Test |
| public void testDocument_toString() { |
| GenericDocument document = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setCreationTimestampMillis(5L) |
| .setPropertyLong("longKey1", 1L, 2L, 3L) |
| .setPropertyDouble("doubleKey1", 1.0, 2.0, 3.0) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyString("stringKey1", "String1", "String2", "String3") |
| .setPropertyBytes("byteKey1", sByteArray1, sByteArray2) |
| .setPropertyDocument("documentKey1", sDocumentProperties1, sDocumentProperties2) |
| .build(); |
| String exceptedString = "{ key: 'creationTimestampMillis' value: 5 } " |
| + "{ key: 'namespace' value: } " |
| + "{ key: 'properties' value: " |
| + "{ key: 'booleanKey1' value: [ 'true' 'false' 'true' ] } " |
| + "{ key: 'byteKey1' value: " |
| + "{ key: 'byteArray' value: [ '1' '2' '3' ] } " |
| + "{ key: 'byteArray' value: [ '4' '5' '6' '7' ] } } " |
| + "{ key: 'documentKey1' value: [ '" |
| + "{ key: 'creationTimestampMillis' value: 12345 } " |
| + "{ key: 'namespace' value: } " |
| + "{ key: 'properties' value: } " |
| + "{ key: 'schemaType' value: sDocumentPropertiesSchemaType1 } " |
| + "{ key: 'score' value: 0 } " |
| + "{ key: 'ttlMillis' value: 0 } " |
| + "{ key: 'uri' value: sDocumentProperties1 } ' '" |
| + "{ key: 'creationTimestampMillis' value: 6789 } " |
| + "{ key: 'namespace' value: } " |
| + "{ key: 'properties' value: } " |
| + "{ key: 'schemaType' value: sDocumentPropertiesSchemaType2 } " |
| + "{ key: 'score' value: 0 } " |
| + "{ key: 'ttlMillis' value: 0 } " |
| + "{ key: 'uri' value: sDocumentProperties2 } ' ] } " |
| + "{ key: 'doubleKey1' value: [ '1.0' '2.0' '3.0' ] } " |
| + "{ key: 'longKey1' value: [ '1' '2' '3' ] } " |
| + "{ key: 'stringKey1' value: [ 'String1' 'String2' 'String3' ] } } " |
| + "{ key: 'schemaType' value: schemaType1 } " |
| + "{ key: 'score' value: 0 } " |
| + "{ key: 'ttlMillis' value: 0 } " |
| + "{ key: 'uri' value: uri1 } "; |
| assertThat(document.toString()).isEqualTo(exceptedString); |
| } |
| |
| @Test |
| public void testDocumentGetValues_differentTypes() { |
| GenericDocument document = new GenericDocument.Builder<>("uri1", "schemaType1") |
| .setScore(1) |
| .setPropertyLong("longKey1", 1L) |
| .setPropertyBoolean("booleanKey1", true, false, true) |
| .setPropertyString("stringKey1", "test-value1", "test-value2", "test-value3") |
| .build(); |
| |
| // Get a value for a key that doesn't exist |
| assertThat(document.getPropertyDouble("doubleKey1")).isEqualTo(0.0); |
| assertThat(document.getPropertyDoubleArray("doubleKey1")).isNull(); |
| |
| // Get a value with a single element as an array and as a single value |
| assertThat(document.getPropertyLong("longKey1")).isEqualTo(1L); |
| assertThat(document.getPropertyLongArray("longKey1")).asList().containsExactly(1L); |
| |
| // Get a value with multiple elements as an array and as a single value |
| assertThat(document.getPropertyString("stringKey1")).isEqualTo("test-value1"); |
| assertThat(document.getPropertyStringArray("stringKey1")).asList() |
| .containsExactly("test-value1", "test-value2", "test-value3"); |
| |
| // Get a value of the wrong type |
| assertThat(document.getPropertyDouble("longKey1")).isEqualTo(0.0); |
| assertThat(document.getPropertyDoubleArray("longKey1")).isNull(); |
| } |
| |
| @Test |
| public void testDocumentInvalid() { |
| GenericDocument.Builder<?> builder = new GenericDocument.Builder<>("uri1", "schemaType1"); |
| assertThrows( |
| IllegalArgumentException.class, |
| () -> builder.setPropertyBoolean("test", new boolean[]{})); |
| } |
| } |