diff --git a/google-cloud-clients/google-cloud-firestore/src/main/java/com/google/cloud/firestore/UserDataConverter.java b/google-cloud-clients/google-cloud-firestore/src/main/java/com/google/cloud/firestore/UserDataConverter.java index 20bd2bc71aee..2b08a12c7026 100644 --- a/google-cloud-clients/google-cloud-firestore/src/main/java/com/google/cloud/firestore/UserDataConverter.java +++ b/google-cloud-clients/google-cloud-firestore/src/main/java/com/google/cloud/firestore/UserDataConverter.java @@ -118,6 +118,8 @@ static Value encodeValue( return Value.newBuilder().setIntegerValue((Long) sanitizedObject).build(); } else if (sanitizedObject instanceof Double) { return Value.newBuilder().setDoubleValue((Double) sanitizedObject).build(); + } else if (sanitizedObject instanceof Float) { + return Value.newBuilder().setDoubleValue((Float) sanitizedObject).build(); } else if (sanitizedObject instanceof Boolean) { return Value.newBuilder().setBooleanValue((Boolean) sanitizedObject).build(); } else if (sanitizedObject instanceof Date) { diff --git a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/LocalFirestoreHelper.java b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/LocalFirestoreHelper.java index caaaa8aca884..566d93ddf408 100644 --- a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/LocalFirestoreHelper.java +++ b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/LocalFirestoreHelper.java @@ -89,6 +89,9 @@ public final class LocalFirestoreHelper { public static final Map UPDATED_FIELD_MAP; public static final Map UPDATED_FIELD_PROTO; + public static final Map SINGLE_FLOAT_MAP; + public static final Map SINGLE_FLOAT_PROTO; + public static final NestedClass NESTED_CLASS_OBJECT; public static final Map SERVER_TIMESTAMP_MAP; @@ -695,6 +698,8 @@ public boolean equals(Object o) { 123000); // Firestore truncates to microsecond precision. GEO_POINT = new GeoPoint(50.1430847, -122.9477780); BLOB = Blob.fromBytes(new byte[] {1, 2, 3}); + SINGLE_FLOAT_MAP = map("float", 0.1F); + SINGLE_FLOAT_PROTO = map("float", Value.newBuilder().setDoubleValue((Float) 0.1F).build()); DATABASE_NAME = "projects/test-project/databases/(default)"; COLLECTION_ID = "coll"; diff --git a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/WriteBatchTest.java b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/WriteBatchTest.java index 4ba3c2bc1f4f..2f1f32fbc3d9 100644 --- a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/WriteBatchTest.java +++ b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/WriteBatchTest.java @@ -169,6 +169,29 @@ public void setDocumentWithValue() throws Exception { assertEquals(commit(writes.toArray(new Write[] {})), commitRequest); } + @Test + public void setDocumentWithFloat() throws Exception { + doReturn(commitResponse(1, 0)) + .when(firestoreMock) + .sendRequest( + commitCapture.capture(), Matchers.>any()); + + batch.set(documentReference, LocalFirestoreHelper.SINGLE_FLOAT_MAP); + + List writes = new ArrayList<>(); + writes.add(set(LocalFirestoreHelper.SINGLE_FLOAT_PROTO)); + + assertEquals(1, batch.getMutationsSize()); + + List writeResults = batch.commit().get(); + for (int i = 0; i < writeResults.size(); ++i) { + assertEquals(Timestamp.ofTimeSecondsAndNanos(i, i), writeResults.get(i).getUpdateTime()); + } + + CommitRequest commitRequest = commitCapture.getValue(); + assertEquals(commit(writes.toArray(new Write[] {})), commitRequest); + } + @Test public void omitWriteResultForDocumentTransforms() throws Exception { doReturn(commitResponse(2, 0)) @@ -234,6 +257,29 @@ public void createDocumentWithValue() throws Exception { assertEquals(commit(writes.toArray(new Write[] {})), commitRequest); } + @Test + public void createDocumentWithFloat() throws Exception { + doReturn(commitResponse(1, 0)) + .when(firestoreMock) + .sendRequest( + commitCapture.capture(), Matchers.>any()); + + batch.create(documentReference, LocalFirestoreHelper.SINGLE_FLOAT_MAP); + + assertEquals(1, batch.getMutationsSize()); + + List writeResults = batch.commit().get(); + List writes = new ArrayList<>(); + + for (int i = 0; i < writeResults.size(); ++i) { + assertEquals(Timestamp.ofTimeSecondsAndNanos(i, i), writeResults.get(i).getUpdateTime()); + writes.add(create(LocalFirestoreHelper.SINGLE_FLOAT_PROTO)); + } + + CommitRequest commitRequest = commitCapture.getValue(); + assertEquals(commit(writes.toArray(new Write[] {})), commitRequest); + } + @Test public void deleteDocument() throws Exception { doReturn(commitResponse(2, 0)) diff --git a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITSystemTest.java b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITSystemTest.java index 45c095d0636c..20f720014437 100644 --- a/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITSystemTest.java +++ b/google-cloud-clients/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITSystemTest.java @@ -167,6 +167,14 @@ public void createDocumentWithValue() throws Exception { assertEquals(SINGLE_FIELD_OBJECT, documentSnapshot.toObject(SingleField.class)); } + @Test + public void createDocumentWithFloat() throws Exception { + assertEquals(20, randomDoc.getId().length()); + randomDoc.create(LocalFirestoreHelper.SINGLE_FLOAT_PROTO).get(); + DocumentSnapshot documentSnapshot = randomDoc.get().get(); + assertEquals(SINGLE_FIELD_OBJECT, documentSnapshot.toObject(SingleField.class)); + } + @Test public void setDocument() throws Exception { Map nanNullMap = new HashMap<>(); @@ -186,6 +194,14 @@ public void setDocumentWithValue() throws Exception { assertEquals(SINGLE_FIELD_OBJECT, documentSnapshot.toObject(SingleField.class)); } + @Test + public void setDocumentWithFloat() throws Exception { + assertEquals(20, randomDoc.getId().length()); + randomDoc.set(LocalFirestoreHelper.SINGLE_FLOAT_PROTO).get(); + DocumentSnapshot documentSnapshot = randomDoc.get().get(); + assertEquals(SINGLE_FIELD_OBJECT, documentSnapshot.toObject(SingleField.class)); + } + @Test public void setDocumentWithMerge() throws Exception { Map originalMap =