#include "test.h" #include namespace { class TestVisitor : public codon::ir::util::Visitor { public: void visit(codon::ir::IntConst *) override { FAIL(); } void visit(codon::ir::BoolConst *) override {} }; class ConstTestVisitor : public codon::ir::util::ConstVisitor { public: void visit(const codon::ir::IntConst *) override { FAIL(); } void visit(const codon::ir::BoolConst *) override {} }; } // namespace using namespace codon::ir; TEST_F(CIRCoreTest, NodeNoReplacementRTTI) { auto *derived = module->Nr(1, module->getIntType()); ASSERT_TRUE(derived); ASSERT_FALSE(derived->hasReplacement()); auto *base = cast(derived); ASSERT_TRUE(base); ASSERT_TRUE(isA(base)); ASSERT_TRUE(isA(base)); ASSERT_TRUE(isA(base)); ASSERT_FALSE(isA(base)); const auto *constBase = base; ASSERT_TRUE(isA(constBase)); ASSERT_TRUE(cast(constBase)); } TEST_F(CIRCoreTest, NodeNoReplacementAttributes) { auto *node = module->Nr(1, module->getIntType()); ASSERT_FALSE(node->hasReplacement()); ASSERT_FALSE(node->hasAttribute()); ASSERT_TRUE(node->hasAttribute()); ASSERT_TRUE(node->getAttribute()); ASSERT_EQ(1, std::distance(node->attributes_begin(), node->attributes_end())); } TEST_F(CIRCoreTest, NodeReplacementRTTI) { Value *node = module->Nr(1, module->getIntType()); ASSERT_TRUE(node); ASSERT_FALSE(node->hasReplacement()); ASSERT_TRUE(isA(node)); node->replaceAll(module->Nr(false, module->getBoolType())); ASSERT_TRUE(node->hasReplacement()); ASSERT_FALSE(isA(node)); ASSERT_TRUE(isA(node)); ASSERT_TRUE(cast(node)); } TEST_F(CIRCoreTest, NodeReplacementDelegates) { auto NODE_NAME = "foo"; Value *originalNode = module->Nr(1, module->getIntType()); Value *newNode = module->Nr(false, module->getBoolType(), NODE_NAME); newNode->setAttribute(std::make_unique()); ASSERT_EQ(0, originalNode->getName().size()); ASSERT_EQ(1, std::distance(originalNode->attributes_begin(), originalNode->attributes_end())); originalNode->replaceAll(newNode); ASSERT_EQ(NODE_NAME, originalNode->getName()); ASSERT_EQ(2, std::distance(originalNode->attributes_begin(), originalNode->attributes_end())); TestVisitor v; originalNode->accept(v); newNode->accept(v); ConstTestVisitor v2; originalNode->accept(v2); newNode->accept(v2); } TEST_F(CIRCoreTest, NodeNonReplaceableFails) { Value *originalNode = module->Nr(1, module->getIntType()); originalNode->setReplaceable(false); ASSERT_DEATH(originalNode->replaceAll(originalNode), ""); }