さらにテストケースを増やしてみる

投稿者: | 2016年2月12日

以前作ったテストコードにはテストケースが足りていないので、今度はエラー条件を羅列してこれらも弾くようにプログラムを修正してみましょう。

  1. “-y”指定時の総引数は1または2
  2. “-m”,”-3″,”+3″指定時の総引数は1,2または3
  3. “-w”はスイッチ指定のみのため総引数は1
  4. “-y”の取りうるオプションは9999までの自然数のみ
  5. “-m”の取りうるオプションは1から12までの自然数のみ

とりあえず4と5の「自然数のチェック」は後回しにして、総引数のテストケースを追加します。ついでにテストケースが増えてきたのでエラー時のみプロパティを表示させることにします。

#! /usr/bin/swift
import Foundation
let testArguments: [(args:[String], raws:Int, cols:Int, weekFlag:Bool,
    year:Int, month:Int, adjust:Int, error:Int32)] =
  [(["no-option"], 1, 1, false, 0, 0, 0, 0),
  (["current-year", "-y"], 4, 3, false, 0, 1, 0, 0),
  (["specified-year", "-y", "2016"], 4, 3, false, 2016, 1, 0, 0),
  (["error-specified-year", "-y", "2016", "extra"], 1, 1, false, 0, 0, 0, 1),
  (["current-month", "-m"], 1, 1, false, 0, 0, 0, 0),
  (["specified-month", "-m", "12"], 1, 1, false, 0, 12, 0, 0),
  (["specified-month-and-year", "-m", "12", "2016"], 1, 1, false, 2016, 12, 0, 0),
  (["error-specified-month", "-m", "2", "2016", "extra"], 1, 1, false, 0, 0, 0, 1),
  (["current-month-and-befor-after", "-3"], 1, 3, false, 0, 0, -1, 0),
  (["specified-month-and-befor-after", "-3", "2"], 1, 3, false, 0, 2, -1, 0),
  (["specified-year-month-and-befor-after", "-3", "2", "2016"], 1, 3, false, 2016, 2, -1, 0),
  (["error-month-and-befor-after", "-3", "2", "2016", "extra"], 1, 1, false, 0, 0, 0, 1),
  (["three-month-from-current", "+3"], 1, 3, false, 0, 0, 0, 0),
  (["specified-three-month-from-current", "+3", "5"], 1, 3, false, 0, 5, 0, 0),
  (["specified-year-three-month-from-current", "+3", "5", "2016"], 1, 3, false, 2016, 5, 0, 0),
  (["error-three-month-from-current", "+3", "5", "2016", "extra"], 1, 1, false, 0, 0, 0, 1),
  (["current-week", "-w"], 1, 1, true, 0, 0, 0, 0),
  (["error-current-week", "-w", "extra"], 1, 1, false, 0, 0, 0, 1),
  (["error", "-x"], 1, 1, false, 0, 0, 0, 1)]
for var i in 0..<testArguments.count {
  print("\(testArguments[i].args) ", terminator:"")
  var options = (raws:0, cols:0, weekFlag:false, year:0, month:0, adjust:0, error:Int32(0))
  options = checkOption(arguments: testArguments[i].args).getCalendarFormat()
  if testArguments[i].raws == options.raws &&
     testArguments[i].cols == options.cols &&
     testArguments[i].weekFlag == options.weekFlag &&
     testArguments[i].year == options.year &&
     testArguments[i].month == options.month &&
     testArguments[i].adjust == options.adjust &&
     testArguments[i].error == options.error {
    print("\u{001B}[0;32m==> OK\u{001B}[0;30m")
  } else {
    print("\u{001B}[0;37;41m==> NG\u{001B}[0;30m")
    print("Raws:\(options.raws), ", terminator:"")
    print("Cols:\(options.cols), ", terminator:"")
    print("WeekFormat:\(options.weekFlag)")
    print("StartYear:\(options.year), ", terminator:"")
    print("StartMonth:\(options.month), ", terminator:"")
    print("AdjustMonth:\(options.adjust), ", terminator:"")
    print("OptionError:\(options.error)")
  }
}

もともとこのクラスは指定オプションに応じた表示フォーマットのデータを返すものなので、オプション指定エラーのような情報がありません。まずはエラープロパティを追加することにしましょう。

最初に総引数をチェックして数が異常であればエラープロパティの値を1にセットして終了させます。

class checkOption {
  private var arguments: [String]
  private var calendarRaws: Int   // 表示月行数
  private var calendarCols: Int   // 表示月列数
  private var weekFormat: Bool    // 週表示指示 = true
  private var startYear: Int      // 年指定なし = 0 (1800...9999)
  private var startMonth: Int     // 月指定なし = 0 (1...12)
  private var adjustMonth: Int    // 表示開始月調整値
  private var optionError: Int32  // エラーなし = 0
                                  // 引数エラー = 1、エラー時は他の全てのプロパティがデフォルト値
  init(arguments: [String], calendarRaws: Int = 1, calendarCols: Int = 1, weekFormat: Bool = false,
      startYear: Int = 0, startMonth: Int = 0, adjustMonth: Int = 0, optionError: Int32 = 0) {
    self.arguments = arguments
    self.calendarRaws = calendarRaws
    self.calendarCols = calendarCols
    self.weekFormat = weekFormat
    self.startYear = startYear
    self.startMonth = startMonth
    self.adjustMonth = adjustMonth
    self.optionError = optionError
  }
  func checkSwitch() {
    if arguments.count > 4 {
      optionError = 1
    } else if arguments.count != 1 {
      switch arguments[1] {
      case "-y":
        if arguments.count == 4 {
          optionError = 1
          break
        } else if arguments.count == 3 {
          startYear = Int(arguments[2])!
        }
        calendarRaws = 4
        calendarCols = 3
        startMonth = 1
      case "-m", "-3", "+3":
        if arguments.count == 4 {
          startMonth = Int(arguments[2])!
          startYear = Int(arguments[3])!
        } else if arguments.count == 3 {
          startMonth = Int(arguments[2])!
        }
        if arguments[1] != "-m" {
          calendarCols = 3
        }
        if arguments[1] == "-3" {
          adjustMonth = -1
        }
      case "-w":
        if arguments.count > 2 {
          optionError = 1
        } else {
          weekFormat = true
        }
      default:
        optionError = 1
      }
    }
  }
  func getCalendarFormat() -> (Int, Int, Bool, Int, Int, Int, Int32) {
    self.checkSwitch()
    return (calendarRaws, calendarCols, weekFormat, startYear, startMonth, adjustMonth, optionError)
  }
}

その後は各スイッチごとに異なる総引数を確認し、数に異常があればエラープロパティの値をセットし、そうでなければ年月等の指定オプションを処理します。

テストコード実行結果

目論見どおり、うまく動作しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です