mkpassのオプションを整理してテストコードを書いた

投稿者: | 2017年2月3日

配列を操作するでオプションに応じた文字一覧を作ることができたので、今度はオプションを指定できるようにしましょう。

オプション仕様を決める

スクリプトの仕様を再検討し、新たにまとめ直してみました。

オプション内容備考
-a全ての半角英数記号を使用その他のオプションよりも優先される
-u全ての大文字英字を使用l,n,sオプションとの組み合わせが可能
-l全ての小文字英字を使用u,n,sオプションとの組み合わせが可能
-n全ての数字を使用u,l,sオプションとの組み合わせが可能
-s全ての記号を使用u,i,nオプションとの組み合わせが可能
-x紛らわしい文字を除外a,u,i,n,sオプションとの組み合わせが可能

自然数cを指定すると生成されるパスワードの桁数を指定できる。ただし今回は手抜きをして、桁数の指定が複数回された時は最後の値を有効にすることにしました。

テストを書く

例によってテスト用の値と期待する結果を組み合わせたデータセットを用意します。CheckOptionクラスに与えられるコマンドライン引数はコマンド名から始まるので、テスト用データ配列の最初に”command”というダミーデータを入れておきました。

テスト条件一覧です。

  • 引数指定なしで正常終了
  • 自然数を指定して文字列長を正しく取得することの確認
  • 自然数以外の数を指定してオプションエラーになることの確認
  • 自然数をふたつ指定して最後のものが有効になることの確認
  • -a, -u, -l, -n, -sそれぞれについて単独指定、xとの組み合わせ、-xとの複合指定について正しいフラグ設定がされることの確認
  • -x単独指定に対して正しいフラグ設定がされることの確認
  • 誤ったオプション-Aを指定された時オプションエラーになることの確認
  • 文字種指定オプション-aと文字列長指定オプション10の組み合わせで正しい出力になることの確認

テストコードです。

#! /usr/bin/swift
import Foundation
struct ConditionDataSet {
  var condition: String
  var arguments: [String]
  var result: (upper: Bool, lower: Bool, number: Bool, symbol: Bool, exclude: Bool, length: Int, status: Int)
}
var returnSet: (upper: Bool, lower: Bool, number: Bool, symbol: Bool, exclude: Bool, length: Int, status: Int)
let testConditionDataSet: [ConditionDataSet] = [
  ConditionDataSet(condition:"No option", arguments:["command",""], result:(false, false, false, false, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct length(10)", arguments:["command","10"], result:(false, false, false, false, false, 10, 0)),
  ConditionDataSet(condition:"Specified invalild length(-10)", arguments:["command","-10"], result:(false, false, false, false, false, 0, 1)),
  ConditionDataSet(condition:"Specified invalild length(0.5)", arguments:["command","0.5"], result:(false, false, false, false, false, 0, 1)),
  ConditionDataSet(condition:"Specified duplicated length(10 5)", arguments:["command","10","5"], result:(false, false, false, false, false, 5, 0)),
  ConditionDataSet(condition:"Specified correct switch(-a)", arguments:["command","-a"], result:(true, true, true, true, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-ax)", arguments:["command","-ax"], result:(true, true, true, true, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-a -x)", arguments:["command","-a","-x"], result:(true, true, true, true, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-u)", arguments:["command","-u"], result:(true, false, false, false, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-ux)", arguments:["command","-ux"], result:(true, false, false, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-u -x)", arguments:["command","-u","-x"], result:(true, false, false, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-l)", arguments:["command","-l"], result:(false, true, false, false, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-lx)", arguments:["command","-lx"], result:(false, true, false, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-l -x)", arguments:["command","-l","-x"], result:(false, true, false, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-n)", arguments:["command","-n"], result:(false, false, true, false, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-nx)", arguments:["command","-nx"], result:(false, false, true, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-n -x)", arguments:["command","-n","-x"], result:(false, false, true, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-s)", arguments:["command","-s"], result:(false, false, false, true, false, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-sx)", arguments:["command","-sx"], result:(false, false, false, true, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-s -x)", arguments:["command","-s","-x"], result:(false, false, false, true, true, 0, 0)),
  ConditionDataSet(condition:"Specified correct switch(-x)", arguments:["command","-x"], result:(false, false, false, false, true, 0, 0)),
  ConditionDataSet(condition:"Specified invalild switch(-A)", arguments:["command","-A"], result:(false, false, false, false, false, 0, 1)),
  ConditionDataSet(condition:"Specified correct switch(-a) and length(10)", arguments:["command","-a","10"], result:(true, true, true, true, false, 10, 0))]
for loop in testConditionDataSet {
  print(loop.condition, terminator:"")
  returnSet = CheckOption(arguments:loop.arguments).getOption()
  if returnSet.upper != loop.result.upper {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.lower != loop.result.lower {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.number != loop.result.number {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.symbol != loop.result.symbol {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.exclude != loop.result.exclude {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.length != loop.result.length {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else if returnSet.status != loop.result.status {
    print("\u{001B}[0;37;41m => NG\u{001B}[0;30m")
    print(returnSet)
  } else {
    print("\u{001B}[0;32m => OK\u{001B}[0;30m")
  }
}

Swiftのif文ってタプル同士の比較ができないので最後の合否判定のところがすごくカッコ悪くなってしまいました。比較条件を&でつなげて複数比較もできるんですが、Bool値だけはこれもダメということでこんな感じになりました。。。

もう少しなんとかしたいです。

コメントを残す

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