/*
This file is part of hugin.
hugin is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
hugin is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with hugin. If not, see .
*/
/**
* @file test_makefilelib.cpp
* @brief Tests all features of the lib.
* Created on: Jul 24, 2010
* @author Florian Achleitner
*/
#include "char_type.h"
#include
#include
#include
#include
#include "Comment.h"
#include "Variable.h"
#include "VariableDef.h"
#include "VariableRef.h"
#include "MakefileItem.h"
#include "Makefile.h"
#include "AutoVariable.h"
#include "Newline.h"
#include "Rule.h"
#include "Conditional.h"
#include "StringAdapter.h"
#include "Manager.h"
#include "test_util.h"
#include
#include
using namespace makefile;
namespace fs = boost::filesystem;
namespace io = boost::iostreams;
namespace makefile { namespace tester {
#ifdef USE_WCHAR
ostream& cout = std::wcout;
ostream& cerr = std::wcerr;
#else
ostream& cout = std::cout;
ostream& cerr = std::cerr;
#endif
struct TestComment : public Test
{
Manager mgr;
TestComment()
:Test("Comment", "")
{
Comment* comment = mgr.own(new Comment(cstr("First line")));
comment->appendLine(cstr("second line"));
comment->appendLine(cstr("third line\nfourth\r line"));
comment->add();
}
};
struct TestRule : public Test
{
Manager mgr;
TestRule()
:Test("Rule", "cp 1.in 1.out\ncp 2.in 2.out\nHello Make\n")
{
Rule& rule = *mgr.own(new Rule());
Rule& rule2 = *mgr.own(new Rule());
rule.addTarget(cstr("all"));
rule.addPrereq(cstr("1.out"));
rule.addPrereq(cstr("2.out"));
rule.addCommand(cstr("@echo Hello Make"));
rule.add();
rule2.addTarget(cstr("%.out"));
rule2.addPrereq(cstr("%.in"));
rule2.addCommand(cstr("cp $*.in $@"));
rule2.add();
std::ofstream in1("1.in"); in1.close();
std::ofstream in2("2.in"); in2.close();
}
bool precond()
{
return fs::exists("1.out") && fs::exists("2.out");
}
~TestRule()
{
fs::remove("1.in"); fs::remove("2.in"); fs::remove("1.out"); fs::remove("2.out");
}
};
struct TestConditional : public Test
{
Manager mgr;
TestConditional()
:Test("Conditional",
"Results:\n"
"cond1 is true\n"
"cond2 is false\n"
"cond3 is true\n"
"cond4 is false\n")
{
Variable& var1 = *mgr.own(new Variable(cstr("VAR1"), cstr("equal")));
Variable& var2 = *mgr.own(new Variable(cstr("VAR2"), cstr("equal")));
Variable& var3 = *mgr.own(new Variable(cstr("VAR3"), cstr("nequal")));
Variable& ifvar1 = *mgr.own(new Variable(cstr("TESTVAR1"), cstr("cond1 is true")));
Variable& ifvar2 = *mgr.own(new Variable(cstr("TESTVAR2"), cstr("cond2 is true")));
Variable& ifvar3 = *mgr.own(new Variable(cstr("TESTVAR3"), cstr("cond3 is true")));
Variable& ifvar4 = *mgr.own(new Variable(cstr("TESTVAR4"), cstr("cond4 is true")));
Variable& elsevar1 = *mgr.own(new Variable(ifvar1.getName(), cstr("cond1 is false")));
Variable& elsevar2 = *mgr.own(new Variable(ifvar2.getName(), cstr("cond2 is false")));
Variable& elsevar3 = *mgr.own(new Variable(ifvar3.getName(), cstr("cond3 is false")));
Variable& elsevar4 = *mgr.own(new Variable(ifvar4.getName(), cstr("cond4 is false")));
ConditionalDEF& cdef1 = *mgr.own(new ConditionalDEF(var1.getName()));
ConditionalDEF& cdef2 = *mgr.own(new ConditionalDEF(cstr("THISISNOTDEFINED")));
ConditionalEQ& ceq1 = *mgr.own(new ConditionalEQ(var1.getRef(), var2.getRef()));
ConditionalEQ& ceq2 = *mgr.own(new ConditionalEQ(var1.getRef(), var3.getRef()));
Rule& rule = *mgr.own(new Rule());
var1.getDef().add();
var2.getDef().add();
var3.getDef().add();
rule.addTarget(cstr("all"));
rule.addCommand(cstr("@echo Results:"));
rule.addCommand(cstr("@echo ") + ifvar1.getRef());
rule.addCommand(cstr("@echo ") + ifvar2.getRef());
rule.addCommand(cstr("@echo ") + ifvar3.getRef());
rule.addCommand(cstr("@echo ") + ifvar4.getRef());
cdef1.addToIf(ifvar1.getDef());
cdef1.addToElse(elsevar1.getDef());
cdef2.addToIf(ifvar2.getDef());
cdef2.addToElse(elsevar2.getDef());
ceq1.addToIf(ifvar3.getDef());
ceq1.addToElse(elsevar3.getDef());
ceq2.addToIf(ifvar4.getDef());
ceq2.addToElse(elsevar4.getDef());
cdef1.add();
cdef2.add();
ceq1.add();
ceq2.add();
rule.add();
// ofstream mf("test.mk");
// Makefile::getSingleton().writeMakefile(mf);
}
};
struct TestVariable : public Test
{
Manager mgr;
const std::vector values;
TestVariable()
: Test("Variable",
"a single value\n"
"3.14592\n"
"a single word__another word__value3\n")
{
Variable* v1 = mgr.own(new Variable(cstr("VAR1"), cstr("a single value")));
Variable* v2 = mgr.own(new Variable(cstr("VAR2"), 3.14592));
std::vector values;
values.push_back("a single word");
values.push_back("another word");
values.push_back("value3");
Variable* v3 = mgr.own(new Variable(cstr("VAR3"), values.begin(), values.end(),
Makefile::SHELL, cstr("__")));
v1->getDef().add(); v2->getDef().add(); v3->getDef().add();
Rule* rule = mgr.own_add(new Rule());
rule->addTarget(cstr("all"));
rule->addCommand(cstr("@echo ") + v1->getRef());
rule->addCommand(cstr("@echo ") + v2->getRef());
rule->addCommand(cstr("@echo ") + v3->getRef());
}
};
void do_test(bool& result, Test* test)
{
result &= test->run();
delete test;
}
}} // namespace
using namespace makefile::tester;
int main(int argc, char *argv[])
{
bool result = true;
do_test(result, new TestComment);
do_test(result, new TestRule);
do_test(result, new TestConditional);
do_test(result, new TestVariable);
return !result; // return 0 on success (= !true)
}