[開発プロセス]宣言と算術ノードのテスト

4140 ワード

E,この算術ノードはArithmaticNodeを指す.
ArithmaticNodeのすべての可能なサブノード項目をテストしたため、今回テストするのは非常に簡単で、演算命令の実行が完了した後、スタックのポップアップの大きさが期待するほど大きいかどうかを確認するだけです.だから、直接テスト例に行きました.
    struct List* ins;
    struct List* subIns;
    struct ArithmaticNode* a;

    struct IntegerNode* i = newIntegerNode(14);
    a = newArithmaticNode((struct AbstractValueNode*)i);
    subIns = i->createInstruction(i);
    ins = a->createInstruction(a);

    assert(1 + subIns->count(subIns) == ins->count(ins));
    while (0 != subIns->count(subIns)) {
        assertInsEqual_Del(ins->popElementAt(ins, 0),
                           subIns->popElementAt(subIns, 0));
    }

    assert(POP == ((struct AbstractInstruction*)
                           (ins->elementAt(ins, 0)))->code);
    assert(INT_SIZE == ((struct IntParamInstruction*)
                           (ins->elementAt(ins, 0)))->param);
    revert(ins->popElementAt(ins, 0));
    ins->finalize(ins);
    subIns->finalize(subIns);
    a->delNode(a);

サブノードに対する命令は、依然として同じノードを生成する命令のもう一つの一致である.次は宣言文の番だ.
宣言文は、命令を生成するほか、シンボルも登録する.ただし、登録記号の具体的な詳細は、記号テーブルモジュールでテストが完了する、指定した変数が登録されているかどうかを確認するために、わずかな簡単な検証作業を行うだけである.例えばこのように
struct {
    char* ident;
    AcceptType type;
    int nrDim;
    int offsets[MAX_ARRAY_SIZE];
    int size;
    int base;
} data[NR_TEST_CASE] = {
    { "testee", INTEGER },
    { "tom", INTEGER },
    { "jerry", REAL },
    { "mANDg", REAL }
};

char* ident = "param";
char* ident1 = "param1";

    struct DeclarationNode* dec;
    struct List* ins;

    initialSymTabManager();
    dec = newDeclarationNode(INTEGER_TYPE);
    dec->vars->enqueue(dec->vars, newVariableNode(ident));
    dec->initVals->enqueue(dec->initVals, NULL);
    dec->vars->enqueue(dec->vars, newVariableNode(ident1));
    dec->initVals->enqueue(dec->initVals, NULL);
    ins = dec->createInstruction(dec);
    //  
    assert(INTEGER == typeOf(dec->vars->peekAt(dec->vars, 0)));
    assert(INTEGER == typeOf(dec->vars->peekAt(dec->vars, 1)));
    assert(0 == ins->count(ins));
    ins->finalize(ins);
    dec->delNode(dec);
    finalizeSymTabManager();

もちろん、初期値を付与動作がないため、何の指令も発生する.初期値を付与する宣言文では、生成された命令をテストする必要があります.これらの命令は、算術ノードと非常に似ています.
    struct DeclarationNode* dec;
    struct VariableNode* var1;
    struct List* ins,* subIns1;

    initialSymTabManager();
    dec = newDeclarationNode(REAL_TYPE);
    dec->vars->enqueue(dec->vars, newVariableNode(ident1));
    dec->initVals->enqueue(dec->initVals, newVariableNode(ident));
    var1 = newVariableNode(ident1);
    ins = dec->createInstruction(dec);
    assert(REAL == typeOf(var1));
    subIns1 = var1->addressOf(var1);

    assert(ins->count(ins) - 2 ==
           subIns0->count(subIns0) + subIns1->count(subIns1));
    while (0 != subIns1->count(subIns1)) {
        assertInsEqual_Del(ins->popElementAt(ins, 0),
                           subIns1->popElementAt(subIns1, 0));
    }
    assert(REAL_ASSIGN == ((struct AbstractInstruction*)
                           (ins->elementAt(ins, 0)))->code);
    revert(ins->popElementAt(ins, 0));
    assert(POP == ((struct AbstractInstruction*)
                           (ins->elementAt(ins, 0)))->code);
    assert(REAL_SIZE == ((struct IntParamInstruction*)
                           (ins->elementAt(ins, 0)))->param);
    revert(ins->popElementAt(ins, 0));
    finalizeSymTabManager();

この2種類のノードの命令生成テストは、概ねこのようなものである.Jerryディレクトリをsvn updateでお願いします.