Skip to content

Commit 63b6865

Browse files
committed
Add unit tests.
1 parent a77fbbe commit 63b6865

File tree

10 files changed

+421
-81
lines changed

10 files changed

+421
-81
lines changed

Firestore/core/test/unit/bundle/bundle_serializer_test.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,16 @@ TEST_F(BundleSerializerTest, DecodesInt32Value) {
653653
VerifyFieldValueRoundtrip(object);
654654
}
655655

656+
TEST_F(BundleSerializerTest, DecodesDecimal128Value) {
657+
ProtoValue decimal_value;
658+
decimal_value.set_string_value("1.2e3");
659+
ProtoValue object;
660+
object.mutable_map_value()->mutable_fields()->insert(
661+
{model::kRawDecimal128TypeFieldValue, decimal_value});
662+
663+
VerifyFieldValueRoundtrip(object);
664+
}
665+
656666
TEST_F(BundleSerializerTest, DecodesRegexValue) {
657667
ProtoValue pattern_value;
658668
ProtoValue options_value;

Firestore/core/test/unit/index/index_value_writer_test.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace {
2929
using testutil::BsonBinaryData;
3030
using testutil::BsonObjectId;
3131
using testutil::BsonTimestamp;
32+
using testutil::Decimal128;
3233
using testutil::Int32;
3334
using testutil::MaxKey;
3435
using testutil::MinKey;
@@ -296,6 +297,28 @@ TEST(IndexValueWriterTest, writeIndexValueSupportsLargestInt32) {
296297
EXPECT_EQ(actual_bytes, expected_bytes);
297298
}
298299

300+
TEST(IndexValueWriterTest, writeIndexValueSupportsDecimal128) {
301+
// Value
302+
auto value = Decimal128("1.2e3");
303+
304+
// Actual
305+
IndexEncodingBuffer encoder;
306+
WriteIndexValue(*value, encoder.ForKind(model::Segment::Kind::kAscending));
307+
auto& actual_bytes = encoder.GetEncodedBytes();
308+
309+
// Expected
310+
IndexEncodingBuffer expected_encoder;
311+
DirectionalIndexByteEncoder* index_byte_encoder =
312+
expected_encoder.ForKind(model::Segment::Kind::kAscending);
313+
index_byte_encoder->WriteLong(IndexType::kNumber);
314+
// We currently store a 64-bit double representation in the client-side index.
315+
index_byte_encoder->WriteDouble(1200.0);
316+
index_byte_encoder->WriteInfinity();
317+
auto& expected_bytes = expected_encoder.GetEncodedBytes();
318+
319+
EXPECT_EQ(actual_bytes, expected_bytes);
320+
}
321+
299322
TEST(IndexValueWriterTest, writeIndexValueSupportsSmallestInt32) {
300323
// Value
301324
auto value = Int32(-2147483648);

Firestore/core/test/unit/local/leveldb_index_manager_test.cc

Lines changed: 172 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ using testutil::BsonBinaryData;
4545
using testutil::BsonObjectId;
4646
using testutil::BsonTimestamp;
4747
using testutil::CollectionGroupQuery;
48+
using testutil::Decimal128;
4849
using testutil::DeletedDoc;
4950
using testutil::Doc;
5051
using testutil::Filter;
@@ -1276,6 +1277,88 @@ TEST_F(LevelDbIndexManagerTest, IndexInt32Fields) {
12761277
});
12771278
}
12781279

1280+
TEST_F(LevelDbIndexManagerTest, IndexDecimal128Fields) {
1281+
persistence_->Run("TestIndexDecimal128Fields", [&]() {
1282+
index_manager_->Start();
1283+
index_manager_->AddFieldIndex(
1284+
MakeFieldIndex("coll", "key", model::Segment::kAscending));
1285+
1286+
AddDoc("coll/doc1", Map("key", Decimal128("-Infinity")));
1287+
AddDoc("coll/doc2", Map("key", Decimal128("-0.0")));
1288+
AddDoc("coll/doc3", Map("key", Decimal128("0")));
1289+
AddDoc("coll/doc4", Map("key", Decimal128("1.3e-3")));
1290+
AddDoc("coll/doc5", Map("key", Decimal128("1.2e3")));
1291+
AddDoc("coll/doc6", Map("key", Decimal128("Infinity")));
1292+
AddDoc("coll/doc7", Map("key", Decimal128("NaN")));
1293+
1294+
auto base_query = Query("coll").AddingOrderBy(OrderBy("key"));
1295+
1296+
{
1297+
SCOPED_TRACE("no filter");
1298+
VerifyResults(base_query, {
1299+
"coll/doc7",
1300+
"coll/doc1",
1301+
"coll/doc2",
1302+
"coll/doc3",
1303+
"coll/doc4",
1304+
"coll/doc5",
1305+
"coll/doc6"
1306+
});
1307+
}
1308+
{
1309+
SCOPED_TRACE("Query Decimal128 with EqualTo filter");
1310+
auto query = base_query.AddingFilter(Filter("key", "==", Decimal128("1200")));
1311+
VerifyResults(query, {"coll/doc5"});
1312+
}
1313+
{
1314+
SCOPED_TRACE("Query Decimal128 with NotEqualTo filter");
1315+
auto query = base_query.AddingFilter(Filter("key", "!=", Decimal128("0")));
1316+
VerifyResults(query, {
1317+
"coll/doc7",
1318+
"coll/doc1",
1319+
"coll/doc4",
1320+
"coll/doc5",
1321+
"coll/doc6"
1322+
});
1323+
}
1324+
{
1325+
SCOPED_TRACE("Query Decimal128 with GreaterThanOrEqualTo filter");
1326+
auto query = base_query.AddingFilter(Filter("key", ">=", Decimal128("0.12e4")));
1327+
VerifyResults(query, {"coll/doc5", "coll/doc6"});
1328+
}
1329+
{
1330+
SCOPED_TRACE("Query Decimal128 with LessThanOrEqualTo filter");
1331+
auto query = base_query.AddingFilter(Filter("key", "<=", Decimal128("0.0")));
1332+
VerifyResults(query, {
1333+
"coll/doc7",
1334+
"coll/doc1",
1335+
"coll/doc2",
1336+
"coll/doc3"
1337+
});
1338+
}
1339+
{
1340+
SCOPED_TRACE("Query Decimal128 with GreaterThan filter");
1341+
auto query = base_query.AddingFilter(Filter("key", ">", Decimal128("1200")));
1342+
VerifyResults(query, {"coll/doc6"});
1343+
}
1344+
{
1345+
SCOPED_TRACE("Query Decimal128 with LessThan filter");
1346+
auto query = base_query.AddingFilter(Filter("key", "<", Decimal128("-Infinity")));
1347+
VerifyResults(query, {"coll/doc7"});
1348+
}
1349+
{
1350+
SCOPED_TRACE("Query Decimal128 with GreaterThan filter and empty result set");
1351+
auto query = base_query.AddingFilter(Filter("key", ">", Decimal128("Infinity")));
1352+
VerifyResults(query, {});
1353+
}
1354+
{
1355+
SCOPED_TRACE("Query Decimal128 with LessThan filter and empty result set");
1356+
auto query = base_query.AddingFilter(Filter("key", "<", Decimal128("NaN")));
1357+
VerifyResults(query, {});
1358+
}
1359+
});
1360+
}
1361+
12791362
TEST_F(LevelDbIndexManagerTest, IndexRegexFields) {
12801363
persistence_->Run("TestIndexRegexFields", [&]() {
12811364
index_manager_->Start();
@@ -1450,23 +1533,45 @@ TEST_F(LevelDbIndexManagerTest, IndexBsonTypesTogether) {
14501533
MakeFieldIndex("coll", "key", model::Segment::kDescending));
14511534

14521535
AddDoc("coll/doc1", Map("key", MinKey()));
1453-
AddDoc("coll/doc2", Map("key", Int32(2)));
1454-
AddDoc("coll/doc3", Map("key", Int32(1)));
1455-
AddDoc("coll/doc4", Map("key", BsonTimestamp(1, 2)));
1456-
AddDoc("coll/doc5", Map("key", BsonTimestamp(1, 1)));
1457-
AddDoc("coll/doc6", Map("key", BsonBinaryData(1, {1, 2, 4})));
1458-
AddDoc("coll/doc7", Map("key", BsonBinaryData(1, {1, 2, 3})));
1459-
AddDoc("coll/doc8", Map("key", BsonObjectId("507f191e810c19729de860eb")));
1460-
AddDoc("coll/doc9", Map("key", BsonObjectId("507f191e810c19729de860ea")));
1461-
AddDoc("coll/doc10", Map("key", Regex("a", "m")));
1462-
AddDoc("coll/doc11", Map("key", Regex("a", "i")));
1463-
AddDoc("coll/doc12", Map("key", MaxKey()));
1536+
AddDoc("coll/doc2", Map("key", Decimal128("NaN")));
1537+
AddDoc("coll/doc3", Map("key", Decimal128("-Infinity")));
1538+
AddDoc("coll/doc4", Map("key", Decimal128("Infinity")));
1539+
AddDoc("coll/doc5", Map("key", Decimal128("0")));
1540+
AddDoc("coll/doc6", Map("key", Decimal128("-1.2e3")));
1541+
AddDoc("coll/doc7", Map("key", Decimal128("2.3e-4")));
1542+
AddDoc("coll/doc8", Map("key", Int32(2)));
1543+
AddDoc("coll/doc9", Map("key", Int32(1)));
1544+
AddDoc("coll/doc10", Map("key", BsonTimestamp(1, 2)));
1545+
AddDoc("coll/doc11", Map("key", BsonTimestamp(1, 1)));
1546+
AddDoc("coll/doc12", Map("key", BsonBinaryData(1, {1, 2, 4})));
1547+
AddDoc("coll/doc13", Map("key", BsonBinaryData(1, {1, 2, 3})));
1548+
AddDoc("coll/doc14", Map("key", BsonObjectId("507f191e810c19729de860eb")));
1549+
AddDoc("coll/doc15", Map("key", BsonObjectId("507f191e810c19729de860ea")));
1550+
AddDoc("coll/doc16", Map("key", Regex("a", "m")));
1551+
AddDoc("coll/doc17", Map("key", Regex("a", "i")));
1552+
AddDoc("coll/doc18", Map("key", MaxKey()));
14641553

14651554
auto query = Query("coll").AddingOrderBy(OrderBy("key", "desc"));
14661555

1467-
VerifyResults(query, {"coll/doc12", "coll/doc10", "coll/doc11", "coll/doc8",
1468-
"coll/doc9", "coll/doc6", "coll/doc7", "coll/doc4",
1469-
"coll/doc5", "coll/doc2", "coll/doc3", "coll/doc1"});
1556+
VerifyResults(query, {
1557+
"coll/doc18",
1558+
"coll/doc16",
1559+
"coll/doc17",
1560+
"coll/doc14",
1561+
"coll/doc15",
1562+
"coll/doc12",
1563+
"coll/doc13",
1564+
"coll/doc10",
1565+
"coll/doc11",
1566+
"coll/doc4",
1567+
"coll/doc8",
1568+
"coll/doc9",
1569+
"coll/doc7",
1570+
"coll/doc5",
1571+
"coll/doc6",
1572+
"coll/doc3",
1573+
"coll/doc2",
1574+
"coll/doc1"});
14701575
});
14711576
}
14721577

@@ -1476,33 +1581,62 @@ TEST_F(LevelDbIndexManagerTest, IndexAllTypesTogether) {
14761581
index_manager_->AddFieldIndex(
14771582
MakeFieldIndex("coll", "key", model::Segment::kDescending));
14781583

1479-
AddDoc("coll/a", Map("key", nullptr));
1480-
AddDoc("coll/b", Map("key", MinKey()));
1481-
AddDoc("coll/c", Map("key", true));
1482-
AddDoc("coll/d", Map("key", std::numeric_limits<double>::quiet_NaN()));
1483-
AddDoc("coll/e", Map("key", Int32(1)));
1484-
AddDoc("coll/f", Map("key", 2.0));
1485-
AddDoc("coll/g", Map("key", 3));
1486-
AddDoc("coll/h", Map("key", Timestamp(100, 123456000)));
1487-
AddDoc("coll/i", Map("key", BsonTimestamp(1, 2)));
1488-
AddDoc("coll/j", Map("key", "string"));
1489-
AddDoc("coll/k", Map("key", BlobValue(0, 1, 255)));
1490-
AddDoc("coll/l", Map("key", BsonBinaryData(1, {1, 2, 3})));
1491-
AddDoc("coll/m", Map("key", Ref("project", "coll/doc")));
1492-
AddDoc("coll/n", Map("key", BsonObjectId("507f191e810c19729de860ea")));
1493-
AddDoc("coll/o", Map("key", GeoPoint(0, 1)));
1494-
AddDoc("coll/p", Map("key", Regex("^foo", "i")));
1495-
AddDoc("coll/q", Map("key", Array(1, 2)));
1496-
AddDoc("coll/r", Map("key", VectorType(1, 2)));
1497-
AddDoc("coll/s", Map("key", Map("a", 1)));
1498-
AddDoc("coll/t", Map("key", MaxKey()));
1584+
AddDoc("coll/doc1", Map("key", nullptr));
1585+
AddDoc("coll/doc2", Map("key", MinKey()));
1586+
AddDoc("coll/doc3", Map("key", true));
1587+
AddDoc("coll/doc4", Map("key", std::numeric_limits<double>::quiet_NaN()));
1588+
AddDoc("coll/doc5", Map("key", Decimal128("NaN")));
1589+
AddDoc("coll/doc6", Map("key", Decimal128("-Infinifty")));
1590+
AddDoc("coll/doc7", Map("key", Decimal128("-1.2e-3")));
1591+
AddDoc("coll/doc8", Map("key", Decimal128("0")));
1592+
AddDoc("coll/doc9", Map("key", Int32(1)));
1593+
AddDoc("coll/doc10", Map("key", 2.0));
1594+
AddDoc("coll/doc11", Map("key", 3));
1595+
AddDoc("coll/doc12", Map("key", Decimal128("2.3e4")));
1596+
AddDoc("coll/doc13", Map("key", Decimal128("Infinifty")));
1597+
AddDoc("coll/doc14", Map("key", Timestamp(100, 123456000)));
1598+
AddDoc("coll/doc15", Map("key", BsonTimestamp(1, 2)));
1599+
AddDoc("coll/doc16", Map("key", "string"));
1600+
AddDoc("coll/doc17", Map("key", BlobValue(0, 1, 255)));
1601+
AddDoc("coll/doc18", Map("key", BsonBinaryData(1, {1, 2, 3})));
1602+
AddDoc("coll/doc19", Map("key", Ref("project", "coll/doc")));
1603+
AddDoc("coll/doc20", Map("key", BsonObjectId("507f191e810c19729de860ea")));
1604+
AddDoc("coll/doc21", Map("key", GeoPoint(0, 1)));
1605+
AddDoc("coll/doc22", Map("key", Regex("^foo", "i")));
1606+
AddDoc("coll/doc23", Map("key", Array(1, 2)));
1607+
AddDoc("coll/doc24", Map("key", VectorType(1, 2)));
1608+
AddDoc("coll/doc25", Map("key", Map("a", 1)));
1609+
AddDoc("coll/doc26", Map("key", MaxKey()));
14991610

15001611
auto query = Query("coll").AddingOrderBy(OrderBy("key", "desc"));
15011612

1502-
VerifyResults(query, {"coll/t", "coll/s", "coll/r", "coll/q", "coll/p",
1503-
"coll/o", "coll/n", "coll/m", "coll/l", "coll/k",
1504-
"coll/j", "coll/i", "coll/h", "coll/g", "coll/f",
1505-
"coll/e", "coll/d", "coll/c", "coll/b", "coll/a"});
1613+
VerifyResults(query, {
1614+
"coll/doc26",
1615+
"coll/doc25",
1616+
"coll/doc24",
1617+
"coll/doc23",
1618+
"coll/doc22",
1619+
"coll/doc21",
1620+
"coll/doc20",
1621+
"coll/doc19",
1622+
"coll/doc18",
1623+
"coll/doc17",
1624+
"coll/doc16",
1625+
"coll/doc15",
1626+
"coll/doc14",
1627+
"coll/doc13",
1628+
"coll/doc12",
1629+
"coll/doc11",
1630+
"coll/doc10",
1631+
"coll/doc9",
1632+
"coll/doc8",
1633+
"coll/doc7",
1634+
"coll/doc6",
1635+
"coll/doc5",
1636+
"coll/doc4",
1637+
"coll/doc3",
1638+
"coll/doc2",
1639+
"coll/doc1"});
15061640
});
15071641
}
15081642

0 commit comments

Comments
 (0)