#include "test.h" #include #include #include "codon/cir/util/matching.h" using namespace codon::ir; TEST_F(CIRCoreTest, SeriesFlowInsertionEraseAndIterators) { auto FIRST_VALUE = 2; auto SECOND_VALUE = 1; auto *f = module->Nr(); f->push_back(module->Nr(SECOND_VALUE, module->getIntType())); f->insert(f->begin(), module->Nr(FIRST_VALUE, module->getIntType())); std::vector contents(f->begin(), f->end()); ASSERT_EQ(2, contents.size()); ASSERT_EQ(FIRST_VALUE, cast(contents[0])->getVal()); ASSERT_EQ(SECOND_VALUE, cast(contents[1])->getVal()); f->erase(f->begin()); ASSERT_EQ(SECOND_VALUE, cast(*f->begin())->getVal()); } TEST_F(CIRCoreTest, SeriesFlowQueryAndReplace) { auto FIRST_VALUE = 2; auto SECOND_VALUE = 1; auto *f = module->Nr(); f->push_back(module->Nr(SECOND_VALUE, module->getIntType())); f->insert(f->begin(), module->Nr(FIRST_VALUE, module->getIntType())); std::vector contents(f->begin(), f->end()); auto used = f->getUsedValues(); ASSERT_TRUE(std::equal(used.begin(), used.end(), contents.begin(), contents.end())); ASSERT_EQ(0, f->getUsedTypes().size()); ASSERT_EQ(0, f->getUsedVariables().size()); ASSERT_EQ(1, f->replaceUsedValue(contents[0], contents[1])); } TEST_F(CIRCoreTest, SeriesFlowCloning) { auto FIRST_VALUE = 2; auto SECOND_VALUE = 1; auto *f = module->Nr(); f->push_back(module->Nr(SECOND_VALUE, module->getIntType())); f->insert(f->begin(), module->Nr(FIRST_VALUE, module->getIntType())); ASSERT_TRUE(util::match(f, cv->clone(f))); } TEST_F(CIRCoreTest, WhileFlowQueryAndReplace) { auto *cond = module->Nr(true, module->getBoolType()); auto *body = module->Nr(); auto *f = module->Nr(cond, body); ASSERT_EQ(cond, f->getCond()); ASSERT_EQ(body, f->getBody()); std::vector usedValues = {cond, body}; auto queried = f->getUsedValues(); ASSERT_TRUE( std::equal(usedValues.begin(), usedValues.end(), queried.begin(), queried.end())); ASSERT_EQ(0, f->getUsedTypes().size()); ASSERT_EQ(0, f->getUsedVariables().size()); ASSERT_EQ( 1, f->replaceUsedValue(cond, module->Nr(true, module->getBoolType()))); ASSERT_EQ(1, f->replaceUsedValue(body, module->Nr())); ASSERT_DEATH(f->replaceUsedValue(f->getBody(), module->Nr(true, module->getBoolType())), ""); queried = f->getUsedValues(); ASSERT_FALSE( std::equal(usedValues.begin(), usedValues.end(), queried.begin(), queried.end())); } TEST_F(CIRCoreTest, WhileFlowCloning) { auto *cond = module->Nr(true, module->getBoolType()); auto *body = module->Nr(); auto *f = module->Nr(cond, body); ASSERT_TRUE(util::match(f, cv->clone(f))); } TEST_F(CIRCoreTest, ForFlowQueryAndReplace) { auto *iter = module->Nr("hi", module->getStringType()); auto *body = module->Nr(); auto *var = module->Nr(module->getStringType(), false, "x"); auto *f = module->Nr(iter, body, var); ASSERT_EQ(iter, f->getIter()); ASSERT_EQ(body, f->getBody()); ASSERT_EQ(var, f->getVar()); std::vector usedValues = {iter, body}; auto qVal = f->getUsedValues(); ASSERT_TRUE( std::equal(usedValues.begin(), usedValues.end(), qVal.begin(), qVal.end())); ASSERT_EQ(0, f->getUsedTypes().size()); std::vector usedVars = {var}; auto qVar = f->getUsedVariables(); ASSERT_TRUE(std::equal(usedVars.begin(), usedVars.end(), qVar.begin(), qVar.end())); ASSERT_EQ(1, f->replaceUsedValue( iter, module->Nr("hi", module->getStringType()))); ASSERT_EQ(1, f->replaceUsedValue(body, module->Nr())); qVal = f->getUsedValues(); ASSERT_FALSE( std::equal(usedValues.begin(), usedValues.end(), qVal.begin(), qVal.end())); ASSERT_EQ(1, f->replaceUsedVariable( var, module->Nr(module->getStringType(), false, "x"))); ASSERT_NE(var, f->getVar()); } TEST_F(CIRCoreTest, ForFlowCloning) { auto *iter = module->Nr("hi", module->getStringType()); auto *body = module->Nr(); auto *var = module->Nr(module->getStringType(), false, "x"); auto *f = module->Nr(iter, body, var); ASSERT_TRUE(util::match(f, cv->clone(f))); } TEST_F(CIRCoreTest, IfFlowQueryAndReplace) { auto *cond = module->Nr(true, module->getBoolType()); auto *tBody = module->Nr(); auto *fBody = module->Nr(); auto *f = module->Nr(cond, tBody, fBody); ASSERT_EQ(cond, f->getCond()); ASSERT_EQ(tBody, f->getTrueBranch()); ASSERT_EQ(fBody, f->getFalseBranch()); std::vector usedValues = {cond, tBody, fBody}; auto qVal = f->getUsedValues(); ASSERT_TRUE( std::equal(usedValues.begin(), usedValues.end(), qVal.begin(), qVal.end())); ASSERT_EQ(0, f->getUsedTypes().size()); ASSERT_EQ(0, f->getUsedVariables().size()); usedValues.pop_back(); f->setFalseBranch(nullptr); qVal = f->getUsedValues(); ASSERT_TRUE( std::equal(usedValues.begin(), usedValues.end(), qVal.begin(), qVal.end())); f->setFalseBranch(fBody); ASSERT_EQ( 1, f->replaceUsedValue(cond, module->Nr(true, module->getBoolType()))); ASSERT_EQ(1, f->replaceUsedValue(tBody, module->Nr())); ASSERT_EQ(1, f->replaceUsedValue(fBody, module->Nr())); ASSERT_DEATH(f->replaceUsedValue(f->getTrueBranch(), module->Nr(true, module->getBoolType())), ""); ASSERT_DEATH(f->replaceUsedValue(f->getFalseBranch(), module->Nr(true, module->getBoolType())), ""); qVal = f->getUsedValues(); ASSERT_FALSE( std::equal(usedValues.begin(), usedValues.end(), qVal.begin(), qVal.end())); } TEST_F(CIRCoreTest, IfFlowCloning) { auto *cond = module->Nr(true, module->getBoolType()); auto *tBody = module->Nr(); auto *fBody = module->Nr(); auto *f = module->Nr(cond, tBody, fBody); ASSERT_TRUE(util::match(f, cv->clone(f))); } TEST_F(CIRCoreTest, TryCatchFlowSingleCatchQueryAndReplace) { auto *body = module->Nr(); auto *finally = module->Nr(); auto *f = module->Nr(body, finally); auto *handler = module->Nr(); auto *var = module->Nr(module->getIntType()); f->emplace_back(handler, module->getIntType(), var); ASSERT_EQ(1, f->replaceUsedVariable(var, module->Nr(module->getFloatType()))); ASSERT_EQ(1, f->replaceUsedType(module->getIntType(), module->getFloatType())); ASSERT_EQ(1, f->replaceUsedValue(handler, module->Nr())); }