|
17 | 17 | #include "rapidjson/stringbuffer.h"
|
18 | 18 | #include "rapidjson/ostreamwrapper.h"
|
19 | 19 | #include <sstream>
|
20 |
| -#include <set> |
| 20 | +#include <map> |
21 | 21 |
|
22 | 22 | using namespace rapidjson;
|
23 | 23 |
|
@@ -1496,72 +1496,75 @@ TEST(Pointer, Ambiguity) {
|
1496 | 1496 | }
|
1497 | 1497 |
|
1498 | 1498 | TEST(Pointer, LessThan) {
|
1499 |
| - static const char *pointers[] = { |
| 1499 | + static const struct { |
| 1500 | + const char *str; |
| 1501 | + bool valid; |
| 1502 | + } pointers[] = { |
| 1503 | + { "/a/b", true }, |
| 1504 | + { "/a", true }, |
| 1505 | + { "/d/1", true }, |
| 1506 | + { "/d/2/z", true }, |
| 1507 | + { "/d/2/3", true }, |
| 1508 | + { "/d/2", true }, |
| 1509 | + { "/a/c", true }, |
| 1510 | + { "/e/f~g", false }, |
| 1511 | + { "/d/2/zz", true }, |
| 1512 | + { "/d/1", true }, |
| 1513 | + { "/d/2/z", true }, |
| 1514 | + { "/e/f~~g", false }, |
| 1515 | + { "/e/f~0g", true }, |
| 1516 | + { "/e/f~1g", true }, |
| 1517 | + { "/e/f.g", true }, |
| 1518 | + { "", true } |
| 1519 | + }; |
| 1520 | + static const char *ordered_pointers[] = { |
| 1521 | + "", |
| 1522 | + "/a", |
1500 | 1523 | "/a/b",
|
1501 | 1524 | "/a/c",
|
1502 |
| - "/a", |
1503 | 1525 | "/d/1",
|
1504 |
| - "/d/2/z", |
1505 |
| - "/d/2/3", |
1506 |
| - "/d/2", |
1507 |
| - "/d/2/zz", |
1508 | 1526 | "/d/1",
|
1509 |
| - "/d/2/z", |
1510 |
| - "/e/f~g", |
1511 |
| - "/e/f~0g", |
1512 |
| - "/e/f~1g", |
1513 |
| - "/e/f~~g", |
1514 |
| - "#/e/f%2fg", |
| 1527 | + "/d/2", |
1515 | 1528 | "/e/f.g",
|
1516 |
| - "" |
1517 |
| - }; |
1518 |
| - static const struct { |
1519 |
| - const char *str; |
1520 |
| - bool valid; |
1521 |
| - } ordered_pointers[] = { |
1522 |
| - { "", true }, |
1523 |
| - { "/a", true }, |
1524 |
| - { "/a/b", true }, |
1525 |
| - { "/a/c", true }, |
1526 |
| - { "/d/1", true }, |
1527 |
| - { "/d/1", true }, |
1528 |
| - { "/d/2", true }, |
1529 |
| - { "/d/2/3", true }, |
1530 |
| - { "/d/2/z", true }, |
1531 |
| - { "/d/2/z", true }, |
1532 |
| - { "/d/2/zz", true }, |
1533 |
| - { "/e/f.g", true }, |
1534 |
| - { "/e/f~1g", true }, |
1535 |
| - { "/e/f~1g", true }, // was "#/e/f%2fg" |
1536 |
| - { "/e/f~0g", true }, |
1537 |
| - { "/e/f~g", false }, |
1538 |
| - { "/e/f~~g", false } |
| 1529 | + "/e/f~1g", |
| 1530 | + "/e/f~0g", |
| 1531 | + "/d/2/3", |
| 1532 | + "/d/2/z", |
| 1533 | + "/d/2/z", |
| 1534 | + "/d/2/zz", |
| 1535 | + NULL, // was invalid "/e/f~g" |
| 1536 | + NULL // was invalid "/e/f~~g" |
1539 | 1537 | };
|
1540 | 1538 | typedef MemoryPoolAllocator<> AllocatorType;
|
1541 | 1539 | typedef GenericPointer<Value, AllocatorType> PointerType;
|
1542 |
| - typedef std::multiset<PointerType> PointerSet; |
| 1540 | + typedef std::multimap<PointerType, size_t> PointerMap; |
| 1541 | + PointerMap map; |
| 1542 | + PointerMap::iterator it; |
1543 | 1543 | AllocatorType allocator;
|
1544 |
| - PointerSet set; |
1545 | 1544 | size_t i;
|
1546 | 1545 |
|
1547 | 1546 | EXPECT_EQ(sizeof(pointers) / sizeof(pointers[0]),
|
1548 | 1547 | sizeof(ordered_pointers) / sizeof(ordered_pointers[0]));
|
1549 | 1548 |
|
1550 | 1549 | for (i = 0; i < sizeof(pointers) / sizeof(pointers[0]); ++i) {
|
1551 |
| - set.insert(PointerType(pointers[i], &allocator)); |
| 1550 | + it = map.insert(PointerMap::value_type(PointerType(pointers[i].str, &allocator), i)); |
| 1551 | + if (!it->first.IsValid()) { |
| 1552 | + EXPECT_EQ(++it, map.end()); |
| 1553 | + } |
1552 | 1554 | }
|
1553 | 1555 |
|
1554 |
| - i = 0; |
1555 |
| - for (PointerSet::iterator it = set.begin(); it != set.end(); ++it) { |
| 1556 | + for (i = 0, it = map.begin(); it != map.end(); ++it, ++i) { |
| 1557 | + EXPECT_TRUE(it->second < sizeof(pointers) / sizeof(pointers[0])); |
| 1558 | + EXPECT_EQ(it->first.IsValid(), pointers[it->second].valid); |
1556 | 1559 | EXPECT_TRUE(i < sizeof(ordered_pointers) / sizeof(ordered_pointers[0]));
|
1557 |
| - EXPECT_EQ(it->IsValid(), ordered_pointers[i].valid); |
1558 |
| - if (it->IsValid()) { |
| 1560 | + EXPECT_EQ(it->first.IsValid(), !!ordered_pointers[i]); |
| 1561 | + if (it->first.IsValid()) { |
1559 | 1562 | std::stringstream ss;
|
1560 | 1563 | OStreamWrapper os(ss);
|
1561 |
| - EXPECT_TRUE(it->Stringify(os)); |
1562 |
| - EXPECT_EQ(ss.str(), ordered_pointers[i].str); |
| 1564 | + EXPECT_TRUE(it->first.Stringify(os)); |
| 1565 | + EXPECT_EQ(ss.str(), pointers[it->second].str); |
| 1566 | + EXPECT_EQ(ss.str(), ordered_pointers[i]); |
1563 | 1567 | }
|
1564 |
| - i++; |
1565 | 1568 | }
|
1566 | 1569 | }
|
1567 | 1570 |
|
|
0 commit comments