15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/ordinal.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cctype> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestOrdinalTraits { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kZeroDigit = '0'; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kMaxDigit = '3'; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kMinLength = 1; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LongOrdinalTraits { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kZeroDigit = '0'; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kMaxDigit = '9'; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kMinLength = 5; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LargeOrdinalTraits { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kZeroDigit = 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kMaxDigit = kuint8max; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kMinLength = 1; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Ordinal<TestOrdinalTraits> TestOrdinal; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Ordinal<LongOrdinalTraits> LongOrdinal; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Ordinal<LargeOrdinalTraits> LargeOrdinal; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kZeroDigit == '0', 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectZeroDigit); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kOneDigit == '1', 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectOneDigit); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kMidDigit == '2', 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectMidDigit); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kMaxDigit == '3', 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectMaxDigit); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kMidDigitValue == 2, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectMidDigitValue); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kMaxDigitValue == 3, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectMaxDigitValue); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(TestOrdinal::kRadix == 4, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestOrdinalHasCorrectRadix); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kZeroDigit == '0', 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkZeroDigit_incorrect); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kOneDigit == '1', 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkOneDigit_incorrect); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kMidDigit == '5', 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkMidDigit_incorrect); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kMaxDigit == '9', 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkMaxDigit_incorrect); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kMidDigitValue == 5, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkMidDigitValue_incorrect); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kMaxDigitValue == 9, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkMaxDigitValue_incorrect); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LongOrdinal::kRadix == 10, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LongOrdinalkRadix_incorrect); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<char>(LargeOrdinal::kZeroDigit) == '\x00', 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkZeroDigit_incorrect); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<char>(LargeOrdinal::kOneDigit) == '\x01', 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkOneDigit_incorrect); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<char>(LargeOrdinal::kMidDigit) == '\x80', 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkMidDigit_incorrect); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<char>(LargeOrdinal::kMaxDigit) == '\xff', 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkMaxDigit_incorrect); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LargeOrdinal::kMidDigitValue == 128, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkMidDigitValue_incorrect); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LargeOrdinal::kMaxDigitValue == 255, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkMaxDigitValue_incorrect); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(LargeOrdinal::kRadix == 256, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LargeOrdinalkRadix_incorrect); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create Ordinals that satisfy all but one criterion for validity. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsValid() should return false for all of them. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, Invalid) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Length criterion. 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(TestOrdinal(std::string()).IsValid()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LongOrdinal("0001").IsValid()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kBeforeZero[] = { '0' - 1, '\0' }; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kAfterNine[] = { '9' + 1, '\0' }; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Character criterion. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal(kBeforeZero).IsValid()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal("4").IsValid()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LongOrdinal(std::string("0000") + kBeforeZero).IsValid()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(LongOrdinal(std::string("0000") + kAfterNine).IsValid()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Zero criterion. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal("0").IsValid()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal("00000").IsValid()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trailing zero criterion. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal("10").IsValid()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TestOrdinal("111110").IsValid()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create Ordinals that satisfy all criteria for validity. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsValid() should return true for all of them. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, Valid) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Length criterion. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(TestOrdinal("1").IsValid()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LongOrdinal("10000").IsValid()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create Ordinals from CreateInitialOrdinal. They should be valid 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and close to the middle of the range. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateInitialOrdinal) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal& ordinal1 = TestOrdinal::CreateInitialOrdinal(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal& ordinal2 = LongOrdinal::CreateInitialOrdinal(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ordinal1.IsValid()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ordinal2.IsValid()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ordinal1.Equals(TestOrdinal("2"))); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ordinal2.Equals(LongOrdinal("50000"))); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create an invalid and a valid Ordinal. EqualsOrBothInvalid should 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return true if called reflexively and false otherwise. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, EqualsOrBothInvalid) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal& valid_ordinal = TestOrdinal::CreateInitialOrdinal(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal invalid_ordinal; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(valid_ordinal.EqualsOrBothInvalid(valid_ordinal)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(invalid_ordinal.EqualsOrBothInvalid(invalid_ordinal)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(invalid_ordinal.EqualsOrBothInvalid(valid_ordinal)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(valid_ordinal.EqualsOrBothInvalid(invalid_ordinal)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create three Ordinals in order. LessThan should return values 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistent with that order. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, LessThan) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal small_ordinal("1"); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal middle_ordinal("2"); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal big_ordinal("3"); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(small_ordinal.LessThan(small_ordinal)); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(small_ordinal.LessThan(middle_ordinal)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(small_ordinal.LessThan(big_ordinal)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(middle_ordinal.LessThan(small_ordinal)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(middle_ordinal.LessThan(middle_ordinal)); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(middle_ordinal.LessThan(big_ordinal)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(big_ordinal.LessThan(small_ordinal)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(big_ordinal.LessThan(middle_ordinal)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(big_ordinal.LessThan(big_ordinal)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create two single-digit ordinals with byte values 0 and 255. The 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// former should compare as less than the latter, even though the 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// native char type may be signed. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, LessThanLarge) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LargeOrdinal small_ordinal("\x01"); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LargeOrdinal big_ordinal("\xff"); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(small_ordinal.LessThan(big_ordinal)); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create three Ordinals in order. GreaterThan should return values 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistent with that order. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, GreaterThan) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal small_ordinal("10000"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal middle_ordinal("55555"); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal big_ordinal("99999"); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(small_ordinal.GreaterThan(small_ordinal)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(small_ordinal.GreaterThan(middle_ordinal)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(small_ordinal.GreaterThan(big_ordinal)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(middle_ordinal.GreaterThan(small_ordinal)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(middle_ordinal.GreaterThan(middle_ordinal)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(middle_ordinal.GreaterThan(big_ordinal)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(big_ordinal.GreaterThan(small_ordinal)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(big_ordinal.GreaterThan(middle_ordinal)); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(big_ordinal.GreaterThan(big_ordinal)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create two valid Ordinals. Equals should return true only when 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called reflexively. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, Equals) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal ordinal1("1"); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal ordinal2("2"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ordinal1.Equals(ordinal1)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ordinal1.Equals(ordinal2)); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ordinal2.Equals(ordinal1)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ordinal2.Equals(ordinal2)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some valid ordinals from some byte strings. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ToInternalValue() should return the original byte string. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(OrdinalTest, ToInternalValue) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", TestOrdinal("2").ToInternalValue()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("12345", LongOrdinal("12345").ToInternalValue()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\1\2\3\4\5", LargeOrdinal("\1\2\3\4\5").ToInternalValue()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsNonEmptyPrintableString(const std::string& str) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < str.length(); ++i) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isprint(str[i])) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some invalid/valid ordinals. ToDebugString() should always 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return a non-empty printable string. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(OrdinalTest, ToDebugString) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsNonEmptyPrintableString(TestOrdinal().ToDebugString())); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsNonEmptyPrintableString(TestOrdinal("invalid string").ToDebugString())); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsNonEmptyPrintableString(TestOrdinal("2").ToDebugString())); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsNonEmptyPrintableString(LongOrdinal("12345").ToDebugString())); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsNonEmptyPrintableString(LargeOrdinal("\1\2\3\4\5").ToDebugString())); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create three Ordinals in order. LessThanFn should return values 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// consistent with that order. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, LessThanFn) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal small_ordinal("1"); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal middle_ordinal("2"); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal big_ordinal("3"); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal::LessThanFn less_than; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(small_ordinal, small_ordinal)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(less_than(small_ordinal, middle_ordinal)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(less_than(small_ordinal, big_ordinal)); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(middle_ordinal, small_ordinal)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(middle_ordinal, middle_ordinal)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(less_than(middle_ordinal, big_ordinal)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(big_ordinal, small_ordinal)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(big_ordinal, middle_ordinal)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(less_than(big_ordinal, big_ordinal)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Traits> 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetBetween(const std::string& ordinal_string1, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& ordinal_string2) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Ordinal<Traits> ordinal1(ordinal_string1); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Ordinal<Traits> ordinal2(ordinal_string2); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Ordinal<Traits> between1 = ordinal1.CreateBetween(ordinal2); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Ordinal<Traits> between2 = ordinal2.CreateBetween(ordinal1); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(between1.Equals(between2)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return between1.ToInternalValue(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals from single-digit strings. Given two strings 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from this set, CreateBetween should return an Ordinal roughly between 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them that are also single-digit when possible. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateBetweenSingleDigit) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("1", "3")); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("12", GetBetween<TestOrdinal>("1", "2")); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("22", GetBetween<TestOrdinal>("2", "3")); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals from strings of various lengths. Given two 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// strings from this set, CreateBetween should return an Ordinal roughly 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// between them that have as few digits as possible. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateBetweenDifferentLengths) { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("102", GetBetween<TestOrdinal>("1", "11")); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("1", "31")); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("132", GetBetween<TestOrdinal>("13", "2")); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("10001", "3")); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20000", GetBetween<LongOrdinal>("10001", "30000")); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("10002", "3")); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20001", GetBetween<LongOrdinal>("10002", "30000")); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("1", "30002")); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("20001", GetBetween<LongOrdinal>("10000", "30002")); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals specifically designed to trigger overflow 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cases. Given two strings from this set, CreateBetween should 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return an Ordinal roughly between them that have as few digits as 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// possible. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateBetweenOverflow) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("03", GetBetween<TestOrdinal>("01", "11")); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("13", GetBetween<TestOrdinal>("11", "21")); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("113", GetBetween<TestOrdinal>("111", "121")); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("001", "333")); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("31", GetBetween<TestOrdinal>("222", "333")); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("3", GetBetween<TestOrdinal>("201", "333")); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("003", "333")); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("2", GetBetween<TestOrdinal>("2223", "1113")); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals specifically designed to trigger digit 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// overflow cases. Given two strings from this set, CreateBetween 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should return an Ordinal roughly between them that have as few digits 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as possible. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateBetweenOverflowLarge) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\x80", GetBetween<LargeOrdinal>("\x01\xff", "\xff\xff")); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\xff\xfe\x80", GetBetween<LargeOrdinal>("\xff\xfe", "\xff\xff")); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals. CreateBefore should return an Ordinal 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// roughly halfway towards 0. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateBefore) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("02", TestOrdinal("1").CreateBefore().ToInternalValue()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("03", TestOrdinal("11").CreateBefore().ToInternalValue()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("03", TestOrdinal("12").CreateBefore().ToInternalValue()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", TestOrdinal("13").CreateBefore().ToInternalValue()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals. CreateAfter should return an Ordinal 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// roughly halfway towards 0. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, CreateAfter) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("31", TestOrdinal("3").CreateAfter().ToInternalValue()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("322", TestOrdinal("32").CreateAfter().ToInternalValue()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("33322", TestOrdinal("3332").CreateAfter().ToInternalValue()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("3", TestOrdinal("22").CreateAfter().ToInternalValue()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("3", TestOrdinal("23").CreateAfter().ToInternalValue()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create two valid Ordinals. EqualsFn should return true only when 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called reflexively. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, EqualsFn) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal ordinal1("1"); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal ordinal2("2"); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestOrdinal::EqualsFn equals; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(equals(ordinal1, ordinal1)); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(equals(ordinal1, ordinal2)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(equals(ordinal2, ordinal1)); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(equals(ordinal2,ordinal2)); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create some Ordinals and shuffle them. Sorting them using 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LessThanFn should produce the correct order. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Ordinal, Sort) { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal ordinal1("12345"); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal ordinal2("54321"); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal ordinal3("87654"); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LongOrdinal ordinal4("98765"); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<LongOrdinal> sorted_ordinals; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorted_ordinals.push_back(ordinal1); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorted_ordinals.push_back(ordinal2); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorted_ordinals.push_back(ordinal3); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorted_ordinals.push_back(ordinal4); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<LongOrdinal> ordinals = sorted_ordinals; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::random_shuffle(ordinals.begin(), ordinals.end()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(ordinals.begin(), ordinals.end(), LongOrdinal::LessThanFn()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(std::equal(ordinals.begin(), ordinals.end(), 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorted_ordinals.begin(), LongOrdinal::EqualsFn())); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 377