| 24 | class VarDesc; |
| 25 | |
| 26 | TEST(ProgramDesc, block_desc_move) { |
| 27 | auto program = std::make_unique<ProgramDesc>(); |
| 28 | auto* global_block = program->MutableBlock(0); |
| 29 | |
| 30 | auto* op = global_block->AppendOp(); |
| 31 | op->SetType("op_with_subblock"); |
| 32 | op->SetAttr("sub_block", program->AppendBlock(*global_block)); |
| 33 | |
| 34 | std::vector<BlockDesc*> sub_blocks; |
| 35 | sub_blocks.push_back(program->AppendBlock(*global_block)); |
| 36 | sub_blocks.push_back(program->AppendBlock(*global_block)); |
| 37 | op->SetAttr("sub_blocks", sub_blocks); |
| 38 | |
| 39 | program->Flush(); |
| 40 | |
| 41 | ProgramDesc program_move; |
| 42 | for (size_t i = 1; i < program->Size(); ++i) { |
| 43 | program_move.AppendBlock(program_move.Block(0)); |
| 44 | } |
| 45 | for (size_t i = 0; i < program->Size(); ++i) { |
| 46 | program_move.MutableBlock(i)->MoveFrom(program->MutableBlock(i)); |
| 47 | } |
| 48 | program = nullptr; |
| 49 | EXPECT_EQ(program_move.Size(), static_cast<size_t>(4)); |
| 50 | op = program_move.Block(0).Op(0); |
| 51 | auto sub_block = op->GetAttrIfExists<BlockDesc*>("sub_block"); |
| 52 | EXPECT_EQ(sub_block, program_move.MutableBlock(1)); |
| 53 | |
| 54 | sub_blocks = op->GetAttrIfExists<std::vector<BlockDesc*>>("sub_blocks"); |
| 55 | EXPECT_EQ(sub_blocks.size(), static_cast<size_t>(2)); |
| 56 | EXPECT_EQ(sub_blocks[0], program_move.MutableBlock(2)); |
| 57 | EXPECT_EQ(sub_blocks[1], program_move.MutableBlock(3)); |
| 58 | } |
| 59 | |
| 60 | TEST(ProgramDesc, copy_ctor) { |
| 61 | ProgramDesc program; |
nothing calls this directly
no test coverage detected