Index: courgette/adjustment_method_unittest.cc |
diff --git a/courgette/adjustment_method_unittest.cc b/courgette/adjustment_method_unittest.cc |
index d8b987c2d89e1ac6be8abe036bfa13f72f5ea31b..970a652dc8e62631310bab8e4ff612fb6374acce 100644 |
--- a/courgette/adjustment_method_unittest.cc |
+++ b/courgette/adjustment_method_unittest.cc |
@@ -7,6 +7,7 @@ |
#include <utility> |
#include <vector> |
+#include "base/bind.h" |
#include "base/strings/string_util.h" |
#include "courgette/assembly_program.h" |
#include "courgette/courgette.h" |
@@ -16,6 +17,10 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
+namespace courgette { |
+ |
+namespace { |
+ |
class AdjustmentMethodTest : public testing::Test { |
public: |
void Test1() const; |
@@ -29,32 +34,39 @@ class AdjustmentMethodTest : public testing::Test { |
// Returns one of two similar simple programs. These differ only in Label |
// assignment, so it is possible to make them look identical. |
- std::unique_ptr<courgette::AssemblyProgram> MakeProgram(int kind) const { |
- std::unique_ptr<courgette::AssemblyProgram> prog( |
- new courgette::AssemblyProgram(courgette::EXE_WIN_32_X86)); |
+ std::unique_ptr<AssemblyProgram> MakeProgram(int kind) const { |
+ std::unique_ptr<AssemblyProgram> prog(new AssemblyProgram(EXE_WIN_32_X86)); |
prog->set_image_base(0x00400000); |
- courgette::RVA kRvaA = 0x00410000; |
- courgette::RVA kRvaB = 0x00410004; |
+ RVA kRvaA = 0x00410000; |
+ RVA kRvaB = 0x00410004; |
- std::vector<courgette::RVA> abs32_rvas; |
+ std::vector<RVA> abs32_rvas; |
abs32_rvas.push_back(kRvaA); |
abs32_rvas.push_back(kRvaB); |
- std::vector<courgette::RVA> rel32_rvas; // Stub. |
+ std::vector<RVA> rel32_rvas; // Stub. |
- courgette::TrivialRvaVisitor abs32_visitor(abs32_rvas); |
- courgette::TrivialRvaVisitor rel32_visitor(rel32_rvas); |
+ TrivialRvaVisitor abs32_visitor(abs32_rvas); |
+ TrivialRvaVisitor rel32_visitor(rel32_rvas); |
prog->PrecomputeLabels(&abs32_visitor, &rel32_visitor); |
- courgette::Label* labelA = prog->FindAbs32Label(kRvaA); |
- courgette::Label* labelB = prog->FindAbs32Label(kRvaB); |
+ Label* labelA = prog->FindAbs32Label(kRvaA); |
+ Label* labelB = prog->FindAbs32Label(kRvaB); |
+ |
+ AssemblyProgram::InstructionGenerator gen = base::Bind( |
+ [](Label* labelA, Label* labelB, AssemblyProgram* prog, |
+ InstructionReceptor* receptor) -> CheckBool { |
+ EXPECT_TRUE(receptor->EmitAbs32(labelA)); |
+ EXPECT_TRUE(receptor->EmitAbs32(labelA)); |
+ EXPECT_TRUE(receptor->EmitAbs32(labelB)); |
+ EXPECT_TRUE(receptor->EmitAbs32(labelA)); |
+ EXPECT_TRUE(receptor->EmitAbs32(labelA)); |
+ EXPECT_TRUE(receptor->EmitAbs32(labelB)); |
+ return true; |
+ }, |
+ labelA, labelB); |
- EXPECT_TRUE(prog->EmitAbs32(labelA)); |
- EXPECT_TRUE(prog->EmitAbs32(labelA)); |
- EXPECT_TRUE(prog->EmitAbs32(labelB)); |
- EXPECT_TRUE(prog->EmitAbs32(labelA)); |
- EXPECT_TRUE(prog->EmitAbs32(labelA)); |
- EXPECT_TRUE(prog->EmitAbs32(labelB)); |
+ EXPECT_TRUE(prog->GenerateInstructions(gen)); |
if (kind == 0) { |
labelA->index_ = 0; |
@@ -68,32 +80,30 @@ class AdjustmentMethodTest : public testing::Test { |
return prog; |
} |
- std::unique_ptr<courgette::AssemblyProgram> MakeProgramA() const { |
+ std::unique_ptr<AssemblyProgram> MakeProgramA() const { |
return MakeProgram(0); |
} |
- std::unique_ptr<courgette::AssemblyProgram> MakeProgramB() const { |
+ std::unique_ptr<AssemblyProgram> MakeProgramB() const { |
return MakeProgram(1); |
} |
// Returns a string that is the serialized version of |program|. |
// Deletes |program|. |
- std::string Serialize( |
- std::unique_ptr<courgette::AssemblyProgram> program) const { |
- std::unique_ptr<courgette::EncodedProgram> encoded; |
+ std::string Serialize(std::unique_ptr<AssemblyProgram> program) const { |
+ std::unique_ptr<EncodedProgram> encoded; |
- const courgette::Status encode_status = Encode(*program, &encoded); |
- EXPECT_EQ(courgette::C_OK, encode_status); |
+ const Status encode_status = Encode(*program, &encoded); |
+ EXPECT_EQ(C_OK, encode_status); |
program.reset(); |
- courgette::SinkStreamSet sinks; |
- const courgette::Status write_status = |
- WriteEncodedProgram(encoded.get(), &sinks); |
- EXPECT_EQ(courgette::C_OK, write_status); |
+ SinkStreamSet sinks; |
+ const Status write_status = WriteEncodedProgram(encoded.get(), &sinks); |
+ EXPECT_EQ(C_OK, write_status); |
encoded.reset(); |
- courgette::SinkStream sink; |
+ SinkStream sink; |
bool can_collect = sinks.CopyTo(&sink); |
EXPECT_TRUE(can_collect); |
@@ -103,18 +113,18 @@ class AdjustmentMethodTest : public testing::Test { |
}; |
void AdjustmentMethodTest::Test1() const { |
- std::unique_ptr<courgette::AssemblyProgram> prog1 = MakeProgramA(); |
- std::unique_ptr<courgette::AssemblyProgram> prog2 = MakeProgramB(); |
+ std::unique_ptr<AssemblyProgram> prog1 = MakeProgramA(); |
+ std::unique_ptr<AssemblyProgram> prog2 = MakeProgramB(); |
std::string s1 = Serialize(std::move(prog1)); |
std::string s2 = Serialize(std::move(prog2)); |
// Don't use EXPECT_EQ because strings are unprintable. |
EXPECT_FALSE(s1 == s2); // Unadjusted A and B differ. |
- std::unique_ptr<courgette::AssemblyProgram> prog5 = MakeProgramA(); |
- std::unique_ptr<courgette::AssemblyProgram> prog6 = MakeProgramB(); |
- courgette::Status can_adjust = Adjust(*prog5, prog6.get()); |
- EXPECT_EQ(courgette::C_OK, can_adjust); |
+ std::unique_ptr<AssemblyProgram> prog5 = MakeProgramA(); |
+ std::unique_ptr<AssemblyProgram> prog6 = MakeProgramB(); |
+ Status can_adjust = Adjust(*prog5, prog6.get()); |
+ EXPECT_EQ(C_OK, can_adjust); |
std::string s5 = Serialize(std::move(prog5)); |
std::string s6 = Serialize(std::move(prog6)); |
@@ -125,3 +135,7 @@ void AdjustmentMethodTest::Test1() const { |
TEST_F(AdjustmentMethodTest, All) { |
Test1(); |
} |
+ |
+} // namespace |
+ |
+} // namespace courgette |