マイヤーズの三角形の問題のテスト対象を google formsで作る

#はじめに
みなさん "マイヤーズの三角形の問題"というのをご存知でしょうか
3辺の長さをあらわす3つの整数を読みとり
出力として、不等辺三角形、二等辺三角形、正三角形を判別して表示するプログラムに対して
テストケースを書くというエクササイズです。
これはテストケースを考案するためのエクササイズとして知られています
考案したのは、グレンフォード・マイヤーズという人で名前を聞いたことがある人も多いでしょう。
彼の名前は、いろんなテスト関連の資料の中に出てきますが、
"The Art of Software Testing "の著者として有名です。
今回このエクササイズを進めてテスト実行するための対象としてgoogle formを使って作ってみたいと思います


#Step 01.フォームを作成する
このフォームの目的は、A,BとCという3つの入力から
三角形のタイプ(正三角形か二等辺三角形か普通の三角形か)を計算し、
答えを表示することです。
取り急ぎこんかフォームを作成しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/5a9c138d-f3f6-cae4-251e-f741c984c814.png)

#Step 03. フォームの入力をSpread Sheetに追加する設定を入れる
最終的な答えはspreadsheetに記載されるためFormの機能を使ってSpread sheetと連携させましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/f4b65a44-d41f-dbc2-2386-32dc80fc57d2.png)
こちらを連携させます

↑のSpreadSheetのURLの部分
https://docs.google.com/spreadsheets/d/XXXXXXX/edit#gid=1030984857
このXXXXの部分をメモっておいてください

#Step02. 三角形を計算するロジックをGoogle Apps Scriptで実装し、連携させます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/30c7d139-37b6-bc49-00da-cead09f5cd47.png)
ここを押すとGoogle App Scriptを追加できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/f8c1f8cf-3951-cfef-c479-13ce4cb889f5.png)

このソースコードの部分に下記をコピペして貼り付けてください

```JavaScript
/**
 * myFunction: main function
 *
 * @return void
 *
 **/
function myFunction() {
	//gather inputs A,B and C from the form
	var inputs = new Array(3); // [A,B,C]
	var form = FormApp.getActiveForm(); // this form
	var formResponses = form.getResponses(); // this response
	for (var i = 0; i < formResponses.length; i++) {
		var itemResponses = formResponses[i].getItemResponses();
		for (var j = 0; j < itemResponses.length; j++) {
			inputs[j] = itemResponses[j].getResponse();
		}
	}

	//validate
	var type = "error"; // default type is "error"
	// type has changed if there are all valid inputs 
	if (validInput(inputs[0], inputs[1], inputs[2])) {
		//categorize the triangle type from inputs
		type = triangleType(inputs[0], inputs[1], inputs[2]);
	}
  
    // log inputs and type
	Logger.log(inputs);
	Logger.log(type);
  
    // put the anser to last row
	var sheet = SpreadsheetApp.openById("Step2でメモったXXXXXX").getSheets()[0];
	var lastRow = sheet.getLastRow();
     
	sheet.getRange(lastRow, 5).setValue(type);
}

/**
 * validateInput: vaidate Inputs
 *
 * @parameter A:integer
 * @parameter B:integer
 * @parameter C:integer
 * @return boolean
 *
 **/
function validInput(A, B, C) {
	// A,B and C all should be a number
	if (isNaN(A) || isNaN(B) || isNaN(C)) {
		return false;
	}
	// A,B and C all should be a integer
	if (!parseInt(Number(A)) == A || !parseInt(Number(B)) == B || !parseInt(Number(C)) == C) {
		return false;
	}
	// A,B and C all should be a positive integer
	if (A < 0 || B < 0 || C < 0) {
		return false;
	}
	// A,B and C all should be less than MAX_VALUE
	if (A > Number.MAX_SAFE_INTEGER || B > Number.MAX_SAFE_INTEGER || C > Number.MAX_SAFE_INTEGER) {
		return false;
	}
	return true;
}

/**
 * triangleType: categorize the triangle from inputs
 *
 * @parameter A:integer
 * @parameter B:integer
 * @parameter C:integer
 * @return string
 *
 **/
function triangleType(A, B, C) {
	// transform to integer type
	A = parseInt(Number(A));
	B = parseInt(Number(B));
	C = parseInt(Number(C));
	// can create a triangle?
	if (!(Math.abs(A - B) < C && C < A + B)) {
		return "not a triangle";
	}
	// can be a equilateral triangle
	if (A === B && B === C && C === A) {
		return "equilateral triangle";
	}
	// can be a isosceles triangle
	if (A === B || B === C || C === A) {
		return "isosceles triangle";
	}
	// or normal
	return "normal triangle";
}
```


#Step 04. トリガーを設定する
先程のソースコードの画面で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/c0da59e0-136a-51e7-4cfc-4fe24d940797.png)
こちらを選択 "+ Add Trigger"を押下して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1817/e29bcb7e-c554-ec8e-6a1a-1c17ec7f67b3.png)
のように設定して
終わり

#デモ
デモはこちらです
https://forms.gle/Z6aCtEYeiW37Vzr66

最後まで読んでいただきありがとうございました！！