Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Unified Diff: unittests/Bitcode/NaClAbbrevTrieTest.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « unittests/Bitcode/Makefile ('k') | unittests/Bitcode/NaClBitReaderTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: unittests/Bitcode/NaClAbbrevTrieTest.cpp
diff --git a/unittests/Bitcode/NaClAbbrevTrieTest.cpp b/unittests/Bitcode/NaClAbbrevTrieTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..cfdd2aa5ce68aba3c24e8d48d3d61518e42b9f38
--- /dev/null
+++ b/unittests/Bitcode/NaClAbbrevTrieTest.cpp
@@ -0,0 +1,972 @@
+//===- llvm/unittest/Bitcode/NaClAbbrevTest.cpp - Tests for NaCl Abbrevs --===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Tests if we properly sort abbreviations when building an
+// abbreviation trie.
+
+#include "llvm/Bitcode/NaCl/AbbrevTrieNode.h"
+#include "llvm/Bitcode/NaCl/NaClBitCodes.h"
+#include "llvm/Bitcode/NaCl/NaClBitcodeValueDist.h"
+#include "gtest/gtest.h"
+
+#include <iostream>
+#include <sstream>
+
+using namespace llvm;
+
+namespace {
+
+static const unsigned MaxValueIndex = NaClValueIndexCutoff + 1;
+
+typedef SmallVector<NaClBitCodeAbbrev*, 32> AbbrevVector;
+
+static void Clear(AbbrevVector &Vector) {
+ for (AbbrevVector::iterator Iter = Vector.begin(), IterEnd = Vector.end();
+ Iter != IterEnd; ++Iter) {
+ (*Iter)->dropRef();
+ }
+}
+
+static void Clear(AbbrevLookupSizeMap &LookupMap) {
+ for (AbbrevLookupSizeMap::iterator
+ Iter = LookupMap.begin(), IterEnd = LookupMap.end();
+ Iter != IterEnd; ++Iter) {
+ delete Iter->second;
+ }
+}
+
+static std::string DescribeAbbreviations(AbbrevVector &Abbrevs) {
+ std::string Message;
+ raw_string_ostream ostrm(Message);
+ for (AbbrevVector::const_iterator
+ Iter = Abbrevs.begin(), IterEnd = Abbrevs.end();
+ Iter != IterEnd; ++Iter) {
+ (*Iter)->Print(ostrm);
+ }
+ return ostrm.str();
+}
+
+static std::string DescribeAbbrevTrieNode(const AbbrevTrieNode *Node,
+ bool LocalOnly) {
+ std::string Message;
+ raw_string_ostream ostrm(Message);
+ if (Node)
+ Node->Print(ostrm, "", LocalOnly);
+ else
+ ostrm << "NULL";
+ return ostrm.str();
+}
+
+static std::string DescribeAbbrevTrie(const AbbrevTrieNode *Node) {
+ return DescribeAbbrevTrieNode(Node, false);
+}
+
+static std::string DescribeAbbrevTrieNode(const AbbrevTrieNode *Node) {
+ return DescribeAbbrevTrieNode(Node, true);
+}
+
+static std::string DescribeRecord(const NaClBitcodeRecordData &Record) {
+ std::string Message;
+ raw_string_ostream ostrm(Message);
+ Record.Print(ostrm);
+ return ostrm.str();
+}
+
+TEST(NaClAbbrevTrieTest, Simple) {
+ // Test example of multiple abbreviations of length 2.
+ AbbrevVector Abbrevs;
+ // [1, VBR(6)]
+ NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(1));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [4, VBR(8)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(4));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrevs.push_back(Abbrev);
+ // [4, 0]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(4));
+ Abbrev->Add(NaClBitCodeAbbrevOp(0));
+ Abbrevs.push_back(Abbrev);
+ // [1, 2]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(1));
+ Abbrev->Add(NaClBitCodeAbbrevOp(2));
+ Abbrevs.push_back(Abbrev);
+ // [1, 0]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(1));
+ Abbrev->Add(NaClBitCodeAbbrevOp(0));
+ Abbrevs.push_back(Abbrev);
+ // [VBR(6), VBR(6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [VBR(6), 0]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(0));
+ Abbrevs.push_back(Abbrev);
+
+ // Verify we built the expected abbreviations.
+ EXPECT_EQ(std::string(
+ "[1, VBR(6)]\n"
+ "[4, VBR(8)]\n"
+ "[4, 0]\n"
+ "[1, 2]\n"
+ "[1, 0]\n"
+ "[VBR(6), VBR(6)]\n"
+ "[VBR(6), 0]\n"),
+ DescribeAbbreviations(Abbrevs));
+
+ // Build lookup map, and check that we build the expected trie.
+ AbbrevLookupSizeMap LookupMap;
+ NaClBuildAbbrevLookupMap(LookupMap, Abbrevs);
+ EXPECT_EQ((size_t)1, LookupMap.size())
+ << "There should only be one entry in the Lookup map "
+ << "for abbreviations of length 2";
+ for (AbbrevLookupSizeMap::iterator
+ Iter = LookupMap.begin(), IterEnd = LookupMap.end();
+ Iter != IterEnd; ++Iter) {
+ EXPECT_EQ(Iter->first, (size_t)2)
+ << "Expecting abbreviations to be of length 2";
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ "Successor Map:\n"
+ " Record.Code = 1\n"
+ " Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " Successor Map:\n"
+ " Record.Values[0] = 0\n"
+ " Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [1, 0] (abbrev #4)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"
+ " Record.Values[0] = 2\n"
+ " Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [1, 2] (abbrev #3)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " Record.Code = 4\n"
+ " Abbreviations:\n"
+ " [4, VBR(8)] (abbrev #1)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " Successor Map:\n"
+ " Record.Values[0] = 0\n"
+ " Abbreviations:\n"
+ " [4, VBR(8)] (abbrev #1)\n"
+ " [4, 0] (abbrev #2)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"
+ " Record.Values[0] = 0\n"
+ " Abbreviations:\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"),
+ DescribeAbbrevTrie(Iter->second));
+ }
+
+ // Test matching [1, 0].
+ NaClBitcodeRecordData Record;
+ Record.Code = 1;
+ Record.Values.push_back(0);
+ EXPECT_EQ(std::string("[1, 0]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [1, 0] (abbrev #4)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [1, 2]
+ Record.Values[0] = 2;
+ EXPECT_EQ(std::string("[1, 2]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [1, 2] (abbrev #3)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [1, 8] (i.e. Record.Values[1] ~in {0, 2}).
+ Record.Values[0] = 8;
+ EXPECT_EQ(std::string("[1, 8]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [1, VBR(6)] (abbrev #0)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [4, 0]
+ Record.Code = 4;
+ Record.Values[0] = 0;
+ EXPECT_EQ(std::string("[4, 0]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [4, VBR(8)] (abbrev #1)\n"
+ " [4, 0] (abbrev #2)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [4, 8] (i.e. Record.Values[1] ~in {0})
+ Record.Values[0] = 8;
+ EXPECT_EQ(std::string("[4, 8]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [4, VBR(8)] (abbrev #1)\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [8, 0] (i.e. Record.Code ~in {1, 4})
+ Record.Code = 8;
+ Record.Values[0] = 0;
+ EXPECT_EQ(std::string("[8, 0]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"
+ " [VBR(6), 0] (abbrev #6)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [7, 6] (i.e. Record.Code ~in {1, 4}
+ // and Record.Values[0] ~in {0})
+ Record.Code = 7;
+ Record.Values[0] = 6;
+ EXPECT_EQ(std::string("[7, 6]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [VBR(6), VBR(6)] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test match [1, 2, 3] (i.e no abbreviations defined).
+ Record.Code = 1;
+ Record.Values[0] = 2;
+ Record.Values.push_back(3);
+ EXPECT_EQ(std::string("[1, 2, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_EQ(Node, (void*) 0);
+ }
+
+ Clear(Abbrevs);
+ Clear(LookupMap);
+}
+
+TEST(NaClAbbrevTrieTest, Array) {
+ // Test for variable length abbreviations, with some specific
+ // unwindings.
+ AbbrevVector Abbrevs;
+ // [Array(VBR(6))]
+ NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [VBR(6), VBR(6), 0, VBR(6), VBR(6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(0));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [8, VBR(6), VBR(6), VBR(6), VBR(6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [VBR(6), VBR(6), VBR(6), 0, VBR(6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(0));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrevs.push_back(Abbrev);
+ // [VBR(6), VBR(6), VBR(6), VBR(6), 3]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 6));
+ Abbrev->Add(NaClBitCodeAbbrevOp(3));
+ Abbrevs.push_back(Abbrev);
+
+ // Verify we built the expected abbreviations.
+ EXPECT_EQ(std::string(
+ "[Array(VBR(6))]\n"
+ "[VBR(6), VBR(6), 0, VBR(6), VBR(6)]\n"
+ "[8, VBR(6), VBR(6), VBR(6), VBR(6)]\n"
+ "[VBR(6), VBR(6), VBR(6), 0, VBR(6)]\n"
+ "[VBR(6), VBR(6), VBR(6), VBR(6), 3]\n"),
+ DescribeAbbreviations(Abbrevs));
+
+ // Build lookup map, and check that we build the expected trie.
+ AbbrevLookupSizeMap LookupMap;
+ NaClBuildAbbrevLookupMap(LookupMap, Abbrevs);
+ EXPECT_EQ(MaxValueIndex+1, LookupMap.size());
+ for (AbbrevLookupSizeMap::iterator
+ Iter = LookupMap.begin(), IterEnd = LookupMap.end();
+ Iter != IterEnd; ++Iter) {
+ EXPECT_LE((size_t)0, Iter->first);
+ EXPECT_GE(MaxValueIndex, Iter->first);
+ if (Iter->first == 5) {
+ // Note that all abbreviations accept records with 5 values.
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ "Successor Map:\n"
+ " Record.Code = 8\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " Successor Map:\n"
+ " Record.Values[1] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " Successor Map:\n"
+ " Record.Values[2] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " Successor Map:\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[2] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " Successor Map:\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[1] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " Successor Map:\n"
+ " Record.Values[2] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " Successor Map:\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[2] = 0\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " Successor Map:\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"
+ " Record.Values[3] = 3\n"
+ " Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrie(Iter->second));
+ } else {
+ // When the record doesn't contain 5 values, only
+ // abbreviation [Array(VBR(6))] applies.
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"),
+ DescribeAbbrevTrie(Iter->second));
+ }
+ }
+
+ // Test matching [8, 10, 0, 0, 3].
+ NaClBitcodeRecordData Record;
+ Record.Code = 8;
+ Record.Values.push_back(10);
+ Record.Values.push_back(0);
+ Record.Values.push_back(0);
+ Record.Values.push_back(3);
+ EXPECT_EQ(std::string("[8, 10, 0, 0, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [8, 10, 0, 11, 3].
+ Record.Values[2] = 11;
+ EXPECT_EQ(std::string("[8, 10, 0, 11, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [8, 10, 0, 11, 12].
+ Record.Values[3] = 12;
+ EXPECT_EQ(std::string("[8, 10, 0, 11, 12]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [8, VBR(6), VBR(6), VBR(6), VBR(6)] (abbrev #2)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 0, 0, 3].
+ Record.Code = 13;
+ Record.Values[2] = 0;
+ Record.Values[3] = 3;
+ EXPECT_EQ(std::string("[13, 10, 0, 0, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 0, 0, 14].
+ Record.Values[3] = 14;
+ EXPECT_EQ(std::string("[13, 10, 0, 0, 14]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 0, 15, 3].
+ Record.Values[2] = 15;
+ Record.Values[3] = 3;
+ EXPECT_EQ(std::string("[13, 10, 0, 15, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 0, 15, 14].
+ Record.Values[3] = 14;
+ EXPECT_EQ(std::string("[13, 10, 0, 15, 14]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), 0, VBR(6), VBR(6)] (abbrev #1)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 16, 0, 3].
+ Record.Values[1] = 16;
+ Record.Values[2] = 0;
+ Record.Values[3] = 3;
+ EXPECT_EQ(std::string("[13, 10, 16, 0, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 16, 0, 17].
+ Record.Values[3] = 17;
+ EXPECT_EQ(std::string("[13, 10, 16, 0, 17]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), 0, VBR(6)] (abbrev #3)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 16, 18, 3].
+ Record.Values[2] = 18;
+ Record.Values[3] = 3;
+ EXPECT_EQ(std::string("[13, 10, 16, 18, 3]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"
+ " [VBR(6), VBR(6), VBR(6), VBR(6), 3] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 16, 18, 19].
+ Record.Values[3] = 19;
+ EXPECT_EQ(std::string("[13, 10, 16, 18, 19]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Array(VBR(6))] (abbrev #0)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [13, 10, 16, 18, 19, 20, 21, 22, 23, 24, 25]
+ Record.Values.push_back(20);
+ Record.Values.push_back(21);
+ Record.Values.push_back(22);
+ Record.Values.push_back(23);
+ Record.Values.push_back(24);
+ Record.Values.push_back(25);
+ EXPECT_EQ(std::string("[13, 10, 16, 18, 19, 20, 21, 22, 23, 24, 25]"),
+ DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_EQ(Node, (void*) 0);
+ }
+
+ Clear(Abbrevs);
+ Clear(LookupMap);
+}
+
+TEST(NaClAbbrevTrieTest, NonsimpleArray) {
+ // Test case where Array doesn't appear first.
+ AbbrevVector Abbrevs;
+ // [Fixed(3), VBR(8), Array(Fixed(8))]
+ NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 3));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 8));
+ Abbrevs.push_back(Abbrev);
+ // [1, VBR(8), Array(Fixed(7))]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(1));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 7));
+ Abbrevs.push_back(Abbrev);
+ // [1, VBR(8), Array(Char6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(1));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
+ Abbrevs.push_back(Abbrev);
+ // [2, VBR(8), Array(Char6)]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(2));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
+ Abbrevs.push_back(Abbrev);
+ // [2, Array(VBR(8))]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(2));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrevs.push_back(Abbrev);
+ // [Fixed(3), VBR(8), 5, Array(Fixed(8))]
+ Abbrev = new NaClBitCodeAbbrev();
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 3));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 8));
+ Abbrev->Add(NaClBitCodeAbbrevOp(5));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
+ Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 8));
+ Abbrevs.push_back(Abbrev);
+
+ // Verify we built the expected abbreviations.
+ EXPECT_EQ(std::string(
+ "[Fixed(3), VBR(8), Array(Fixed(8))]\n"
+ "[1, VBR(8), Array(Fixed(7))]\n"
+ "[1, VBR(8), Array(Char6)]\n"
+ "[2, VBR(8), Array(Char6)]\n"
+ "[2, Array(VBR(8))]\n"
+ "[Fixed(3), VBR(8), 5, Array(Fixed(8))]\n"),
+ DescribeAbbreviations(Abbrevs));
+
+ // Build lookup map, and check that we build the expected trie.
+ AbbrevLookupSizeMap LookupMap;
+ NaClBuildAbbrevLookupMap(LookupMap, Abbrevs);
+ // Note: Above abbreviations accept all record lengths but 0. Hence,
+ // there should be one for each possible (truncated) record length
+ // except zero.
+ EXPECT_EQ(MaxValueIndex, LookupMap.size())
+ << "Should accept all (truncated) record lengths (except 0)";
+ for (AbbrevLookupSizeMap::iterator
+ Iter = LookupMap.begin(), IterEnd = LookupMap.end();
+ Iter != IterEnd; ++Iter) {
+ NaClBitcodeRecordData Record;
+ switch (Iter->first) {
+ case 0:
+ ASSERT_FALSE(true) << "There are not abbreviations of length 0";
+ break;
+ case 1:
+ EXPECT_EQ(std::string(
+ "Successor Map:\n"
+ " Record.Code = 2\n"
+ " Abbreviations:\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrie(Iter->second));
+
+ // Test matching [2]
+ Record.Code = 2;
+ EXPECT_EQ(std::string("[2]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+
+ // Test matching [5];
+ Record.Code = 5;
+ EXPECT_EQ(std::string("[5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(""),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [2, 10]
+ Record.Code = 2;
+ Record.Values.push_back(10);
+ EXPECT_EQ(std::string("[2, 10]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ break;
+ case 2:
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ "Successor Map:\n"
+ " Record.Code = 1\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"
+ " Record.Code = 2\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrie(Iter->second));
+
+ // Test matching [1, 5]
+ Record.Code = 1;
+ Record.Values.push_back(5);
+ EXPECT_EQ(std::string("[1, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [2, 5]
+ Record.Code = 2;
+ EXPECT_EQ(std::string("[2, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [3, 5]
+ Record.Code = 3;
+ EXPECT_EQ(std::string("[3, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ break;
+ case 3:
+ default:
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ "Successor Map:\n"
+ " Record.Code = 1\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"
+ " Successor Map:\n"
+ " Record.Values[1] = 5\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"
+ " Record.Code = 2\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"
+ " Successor Map:\n"
+ " Record.Values[1] = 5\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"
+ " Record.Values[1] = 5\n"
+ " Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"),
+ DescribeAbbrevTrie(Iter->second));
+
+ // Test matching [1, 0, 5]
+ Record.Code = 1;
+ Record.Values.push_back(0);
+ Record.Values.push_back(5);
+ EXPECT_EQ(std::string("[1, 0, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [1, 0, 50]
+ Record.Values[1] = 50;
+ EXPECT_EQ(std::string("[1, 0, 50]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [2, 0, 5]
+ Record.Code = 2;
+ Record.Values[1] = 5;
+ EXPECT_EQ(std::string("[2, 0, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [2, 0, 50]
+ Record.Values[1] = 50;
+ EXPECT_EQ(std::string("[2, 0, 50]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [2, VBR(8), Array(Char6)] (abbrev #3)\n"
+ " [2, Array(VBR(8))] (abbrev #4)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [5, 0, 5]
+ Record.Code = 5;
+ Record.Values[1] = 5;
+ EXPECT_EQ(std::string("[5, 0, 5]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [5, 0, 50]
+ Record.Values[1] = 50;
+ EXPECT_EQ(std::string("[5, 0, 50]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [5, 0, 50, 10]
+ Record.Values.push_back(10);
+ EXPECT_EQ(std::string("[5, 0, 50, 10]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [5, 0, 50, 10, 20]
+ Record.Values.push_back(20);
+ EXPECT_EQ(std::string("[5, 0, 50, 10, 20]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ // Test matching [1, 0, 5, 10, 20]
+ Record.Code = 1;
+ Record.Values[1] = 5;
+ EXPECT_EQ(std::string("[1, 0, 5, 10, 20]"), DescribeRecord(Record));
+ {
+ AbbrevTrieNode *Node = LookupMap[Record.Values.size()+1];
+ ASSERT_NE(Node, (void*) 0);
+ EXPECT_EQ(std::string(
+ "Abbreviations:\n"
+ " [Fixed(3), VBR(8), Array(Fixed(8))] (abbrev #0)\n"
+ " [1, VBR(8), Array(Fixed(7))] (abbrev #1)\n"
+ " [1, VBR(8), Array(Char6)] (abbrev #2)\n"
+ " [Fixed(3), VBR(8), 5, Array(Fixed(8))] (abbrev #5)\n"),
+ DescribeAbbrevTrieNode(Node->MatchRecord(Record)));
+ }
+ break;
+ }
+ }
+
+ Clear(Abbrevs);
+ Clear(LookupMap);
+}
+
+}
« no previous file with comments | « unittests/Bitcode/Makefile ('k') | unittests/Bitcode/NaClBitReaderTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698