1

VS Express 2013では、スペックファイルに書かれた特定のテストケースに対して次のプログラムを実行します。テストケースを含むspecファイルでテストケースが合格も失敗もVS

struct DOB { 
    int date; 
    int month; 
    int year; 
}; 

int stringToValue(char* temp) { 
    int num = 0; 
    while (*temp != '-' && *temp != '\0') { 
     if (((*temp) >= '0') && ((*temp) <= '9')) { 
      num = num * 10 + ((*temp) - '0'); 
      ++temp; 
     } 
    } 
    return num; 
} 

int isValidFormat(char* dob) { 
    int length = 0; 
    for (int i = 0; dob[i] != '\0'; ++i) { 
     if (!((dob[i] >= '0' && dob[i] <= '9' || dob[i] == '-'))) 
      return 0; 
     ++length; 
    } 
    return length; 
} 

int function(int value1, int value2) { 
    if (value1>value2) { 
     return 2; 
    } 

    else if (value1<value2) { 
     return 1; 
    } 
    else 
     return 0; 
} 

int isLeap(int year) { 
    if ((year % 4 == 0) && !(year % 100)) { 
     return 1; 
    } 

    else { 
     if (year % 400 == 0) 
      return 1; 
     else 
      return 0; 
    } 
} 

int isValid(struct DOB d) { 
    if (d.year>0) { 
     if (d.month>0 && d.month <= 12) { 
      if (d.month == 2 && isLeap(d.year) == 1) { 
       if (d.date>0 && d.date <= 29) { 
        return 1; 
       } 
       else if (d.date > 0 && d.date <= 28) { 
        return 1; 
       } 
       else 
        return 0; 
      } 
      else if (d.date == 1 || d.date == 3 || d.date == 5 || d.date == 7 || d.date == 8 || d.date == 10 || d.date == 12){ 
       if (d.date > 0 && d.date <= 31) { 
        return 1; 
       } 
       else 
        return 0; 
      } 
      else { 
       if (d.date > 0 && d.date <= 30) { 
        return 1; 
       } 
       else 
        return 0; 
      } 
     } 
     else { 
      return 0; 
     } 
    } 
    else { 
     return 0; 
    } 
} 

int isOlder(char* dob1, char* dob2) { 
    struct DOB d1, d2; 

    if (isValidFormat(dob1)!= 10 && isValidFormat(dob2) != 10) 
     return -1; 

    d1.date = stringToValue(dob1); 
    d2.date = stringToValue(dob2); 
    d1.month = stringToValue(dob1 + 3); 
    d2.month = stringToValue(dob2 + 3); 
    d1.year = stringToValue(dob1 + 6); 
    d2.year = stringToValue(dob2 + 6); 

    if (isValid(d1) == 1 && isValid(d2) == 1) { 
     if (function(d1.year, d2.year) != 0) 
      return function(d1.year, d2.year); 
     else if (function(d1.month, d2.month) != 0) 
      return function(d1.month, d2.month); 
     else 
      return function(d1.date, d2.date); 
    } 

    else { 
     return -1; 
    } 
} 

:コードとspecファイルの一部は以下の通りである

TEST_METHOD(isOlderinvalid) 
       { 
        Assert::AreEqual(-1, isOlder("1000", "15-07-2000"), L"isOlder: invalid input case failed", LINE_INFO()); 
        Assert::AreEqual(-1, isOlder("15-07-2000", "000"), L"isOlder: invalid input case failed", LINE_INFO()); 
        Assert::AreEqual(-1, isOlder("15-0A-2000", "15-07-2000"), L"isOlder: invalid input case failed", LINE_INFO()); 
        Assert::AreEqual(-1, isOlder("15-13-2000", "15-07-2000"), L"isOlder: invalid input case failed", LINE_INFO()); 
        Assert::AreEqual(-1, isOlder("29-02-2001", "15-07-2000"), L"isOlder: invalid input case failed", LINE_INFO()); 
       } 

私は私の地元のコンパイラで次のテストケースを実行し、私は期待される出力を得る。しかし、上記のコードでテストを実行すると、上記のテストケースを合格または不合格にすることはありません。私は正直に何が間違っているのか分かりません。私のコードの問題ではなく、VS固有の問題のようです。

+0

コードのどの部分が期待どおりに分岐しなかったかを知るために、VSでデバッグをいくつか試行しましたか? – Lovy

+1

'isValidFormat(" 0000000000 ")'と 'isValidFormat(" ---------- ")'はどちらも非ゼロを返します。フォーマットチェックではありません。 – chux

+0

'stringToValue()'は非数字、非 '-'文字で呼び出されると無限ループになります。制御された用途でのみ有効なので、静的にすることを提案する。 – chux

答えて

0

間違ったエラー状態

// if (isValidFormat(dob1)!= 10 && isValidFormat(dob2) != 10) 
if (isValidFormat(dob1)!= 10 || isValidFormat(dob2) != 10) 
    return -1; 

のみ1形式が不正であった場合、不正な入力を有する無限ループを有する弱関数stringToValue()と呼ばれるコード。

int stringToValue(char* temp) { 
    int num = 0; 
    while (*temp != '-' && *temp != '\0') { 
     if (((*temp) >= '0') && ((*temp) <= '9')) { 
      num = num * 10 + ((*temp) - '0'); 
      ++temp; // Move this to outside `if()` test 
     } 
    } 
    return num; 
} 

おそらく追加の問題です。

OPのローカルコンパイラでコードがどのように「機能した」かわかりません。多分Assert()はアクティブではありませんでした。

+0

ありがとう!これとその他の軽微な問題が原因でした。しかし、あなたが提案したいと思うフォーマットチェックの良い方法はありますか?あなたの考えを知りたい! –

関連する問題