QUnit,PHP,Netbeans,lubuntu-14.04,VirtualBox | 乖離のぶろぐ(*´∀`)吸い込んで応援
(゚ω゚)まずは関連情報。
http://ameblo.jp/pochifx/entry-11827710016.html
lubuntu-14.04-desktop-amd64.iso netbeans-xdebug
http://ameblo.jp/pochifx/entry-11803948927.html
lubuntu-13.10-desktop-amd64.iso NetBeans PHP(2)
仮想ホストを作り、netbeans-xdebug

https://twitter.com/kai_ri_no/status/469262405201977344
乖離 ‏@kai_ri_no
勉強は VirtualBox Ubuntu cURL Xerces rsyslog CppUnit
lubuntu PHP MySQL Apache2 netbeans-xdebug PHPUnit
という順。次は QUnit と exValidation
8:44 - 2014年5月22日

(゚ω゚)サンプルプログラム、どこかに落ちてないかな?
(゚ω゚)また、ここが見つかった。
http://www.buildinsider.net/web/bookjslib111/111
[QUnit]テストコードを実行し、ブラウザで結果を確認する - Build Insider:

(゚ω゚)本家のサイトも合わせて読んでいこう。
http://qunitjs.com/intro/
20140523_004454_JST_lubuntu-14.04-desktop-amd64.iso jQuery QUnit.png

http://www.forest.impress.co.jp/docs/news/20140521_649476.html
「Google Chrome 35」安定版が公開、次世代JavaScript規格“ECMAScript 6”対応が拡充 - 窓の杜:(2014/5/21 13:19)

(゚ω゚) いかにもデバッグしていません。と思われるfunction prettyDate(time)
(゚ω゚) returnは変数だけ書くべき。これはまるでデバックしていません。
(゚ω゚) こんなソースを書いていると、小学生レベルです。だからプリティ。
http://qunitjs.com/intro/

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mangled date examples</title>
<script>
function prettyDate(time){
var date = new Date(time || ""),
diff = (((new Date()).getTime() - date.getTime()) / 1000),
day_diff = Math.floor(diff / 86400);

if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 )
return;

return day_diff == 0 && (
diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor( diff / 60 ) +
" minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor( diff / 3600 ) +
" hours ago") ||
day_diff == 1 && "Yesterday" ||
day_diff < 7 && day_diff + " days ago" ||
day_diff < 31 && Math.ceil( day_diff / 7 ) +
" weeks ago";
}

window.onload = function() {
var links = document.getElementsByTagName("a");
for ( var i = 0; i < links.length; i++ ) {
if ( links[i].title ) {
var date = prettyDate(links[i].title);
if ( date ) {
links[i].innerHTML = date;
}
}
}
};
</script>
</head>
<body>

<ul>
<li class="entry">
<p>blah blah blah...</p>
<small class="extra">
Posted <span class="time">
<a href="/2008/01/blah/57/" title="2008-01-28T20:24:17Z">
<span>January 28th, 2008</span>
</a>
</span>
by <span class="author"><a href="/john/">John Resig</a></span>
</small>
</li>
<!-- more list items -->
</ul>

</body>
</html>


(゚ω゚)読み進むとjavaScriptのテストの例が載ってある。
Run this example. (Make sure to enable a console such as Firebug or Chrome’s Web Inspector.)
view-source:http://qunitjs.com/resources/intro/3-first-test.html
(゚ω゚)最近のブラウザにはF12キーを押すと、コンソール付きのデバッグも可能。


view-source:http://qunitjs.com/resources/intro/4-qunit-test.html

The QUnit JavaScript Test Suite
(゚ω゚)この辺りから、QUnitのテスト方法らしい。ソースを見てみると・・
view-source:http://qunitjs.com/resources/intro/4-qunit-test.html
(゚ω゚)テストするには、2個のファイルが必須。
qunit.css
qunit.js
(゚ω゚)これはテストするfunctionが書かれている。
prettydate.js
(゚ω゚)テストの方法。
(゚ω゚) "prettydate basics"は、テスト名。functionが評価処理ということ。
(゚ω゚) functionの中には、テストするprettyDate関数を中に何度も書いている。
	test("prettydate basics", function() {
var now = "2008/01/28 22:25:00";
equal(prettyDate(now, "2008/01/28 22:24:30"), "just now");
equal(prettyDate(now, "2008/01/28 22:23:30"), "1 minute ago");
equal(prettyDate(now, "2008/01/28 21:23:30"), "1 hour ago");
equal(prettyDate(now, "2008/01/27 22:23:30"), "Yesterday");
equal(prettyDate(now, "2008/01/26 22:23:30"), "2 days ago");
equal(prettyDate(now, "2007/01/26 22:23:30"), undefined);
});


Refactoring, Stage 1
view-source:http://qunitjs.com/resources/intro/5-qunit-test-refactored.html
(゚ω゚) functionは、テスト関数のマクロ(C言語で言うと)でもあるらしい。
(゚ω゚) テストするprettyDate関数を、別関数へ置き換えることも出来る。

test("prettydate basics", function() {
function date(then, expected) {
equal(prettyDate("2008/01/28 22:25:00", then), expected);
}
date("2008/01/28 22:24:30", "just now");
date("2008/01/28 22:23:30", "1 minute ago");
date("2008/01/28 21:23:30", "1 hour ago");
date("2008/01/27 22:23:30", "Yesterday");
date("2008/01/26 22:23:30", "2 days ago");
date("2007/01/26 22:23:30", undefined);
});

http://www.c-lang.org/define.html
関数マクロ
defineによるマクロ置換は、引数付きにすることができます。これは関数マクロと呼ばれています。一見すると関数を呼び出しているように見えます。以下の書式で定義します。
#define マクロ名(引数) 処理
実際の例を見てみましょう。次のマクロは、2つの引数を取り小さい方を返します。
#define MIN(a, b) ((a) < (b) ? (a) : (b))

(゚ω゚)テストするprettydate.jsを置き忘れると、エラーメッセージが出る。


Died on test #1     at http://localhost/PhpProject9/resources/intro/5-qunit-test-refactored.html:11:2: prettyDate is not defined
Source:
ReferenceError: prettyDate is not defined
at date (http://localhost/PhpProject9/resources/intro/5-qunit-test-refactored.html:13:10)
at Object. (http://localhost/PhpProject9/resources/intro/5-qunit-test-refactored.html:15:3)

(゚ω゚)テスト結果を、F12キーを押してHTMLの要素を見てみた。


Testing The DOM manipulation
view-source:http://qunitjs.com/resources/intro/6-qunit-dom.html
(゚ω゚) 今の動作環境。

ubuntu@ubuntu-VirtualBox:~/NetBeansProjects/PhpProject9$ ls -lR
.:
合計 12
-rw-rw-r-- 1 ubuntu ubuntu 2165 5月 23 01:37 index.php
drwxrwxr-x 3 ubuntu ubuntu 4096 5月 23 01:35 nbproject
drwxrwxr-x 3 ubuntu ubuntu 4096 5月 23 11:27 resources

./nbproject:
合計 12
drwxrwxr-x 2 ubuntu ubuntu 4096 5月 23 11:42 private
-rw-rw-r-- 1 ubuntu ubuntu 134 5月 23 01:35 project.properties
-rw-rw-r-- 1 ubuntu ubuntu 313 5月 23 01:35 project.xml

./nbproject/private:
合計 8
-rw-rw-r-- 1 ubuntu ubuntu 55 5月 23 01:35 private.properties
-rw-rw-r-- 1 ubuntu ubuntu 469 5月 23 11:42 private.xml

./resources:
合計 80
drwxrwxr-x 2 ubuntu ubuntu 4096 5月 23 11:31 intro
-rw-rw-r-- 1 ubuntu ubuntu 4362 5月 23 11:24 qunit-1.14.0.css
-rw-rw-r-- 1 ubuntu ubuntu 61033 5月 23 11:24 qunit-1.14.0.js
lrwxrwxrwx 1 ubuntu ubuntu 16 5月 23 11:27 qunit.css -> qunit-1.14.0.css
lrwxrwxrwx 1 ubuntu ubuntu 15 5月 23 11:27 qunit.js -> qunit-1.14.0.js

./resources/intro:
合計 92
-rw-rw-r-- 1 ubuntu ubuntu 702 5月 23 11:28 5-qunit-test-refactored.html
-rw-rw-r-- 1 ubuntu ubuntu 2074 5月 23 11:30 6-qunit-dom.html
-rw-rw-r-- 1 ubuntu ubuntu 771 5月 23 11:22 prettydate.js
-rw-rw-r-- 1 ubuntu ubuntu 956 5月 23 11:31 prettydate2.js
-rw-rw-r-- 1 ubuntu ubuntu 58475 5月 23 11:29 qunit.js
ubuntu@ubuntu-VirtualBox:~/NetBeansProjects/PhpProject9$



(゚ω゚) qunit-1.14.0.jsを使ってるけど、テストできた。
(゚ω゚) 日付の条件式を後に記述してるから、時間差を返す。
(゚ω゚) 期待していたのは「一日差」だったらしい。
(゚ω゚) return 一個で書こうとする考えは間違っていた。

(゚ω゚) それから、時刻差の計算のテストなのに、
(゚ω゚) DOM操作のテストも加えてバグの切り分けが出来なくしてしまったという、
(゚ω゚) 謎のチュートリアルだった。
(゚ω゚) 動的にテストデータを変えることが出来ると伝えたかったのだろう。

(゚ω゚) 8個のa要素の中から、titleを持っているa要素は2個。
(゚ω゚) 処理時間がかかる探し方と言える。

https://www.google.co.jp/search?q=getElementsByTagName

http://d.hatena.ne.jp/m383m/20070919/1190190692

var callback = {
success : function(o) {
alert("success:" + o);
},
failure : function(o) {
alert("failure:" + o);
}
}
function kakunin() {
callback['failure']('xyz');
}

以下のように記述したのと同等。

var callback = new Array();
callback['success'] = function(o) {
alert("success:" + o);
};
callback['failure'] = function(o) {
alert("failure:" + o);
};


http://api.qunitjs.com/
QUnit API Documentation
(゚ω゚)以下の事が書かれてある。順番に試してみよう。
Assert
Async Control
Callbacks
Configuration
Test



(゚ω゚)赤で囲った部分は実行しないが、 次のscript要素は実行してる。


http://api.qunitjs.com/throws/
(゚ω゚)エラーの有無、エラーメッセージ完全一致と部分一致、期待してたエラー処理関数。
(゚ω゚)というテストが行える。

test("throws test", function() {
function CustomError(message) {
this.message = message;
}
function CustomError1(message) {
this.message = message;
}
CustomError.prototype.toString = function() {
return this.message;
};
/* 1. */ throws( function() {
throw new Error("エラーメッセージ");
}, "なにかエラーがあるとOK");
/* 2. */ throws( function() {
}, "なにもエラーが無いとNG");
/* 3. */ throws( function() {
throw new CustomError("作成ErrorMsg");
}, "作成Errormsg", "期待したエラーメッセージと違うため、NG");
/* 4. */ throws( function() {
throw new CustomError("作成ErrorMsg");
}, "作成ErrorMsg", "期待したエラーメッセージだったため、OK");
/* 5. */ throws( function() {
throw new CustomError("作成されたエラーメッセージ5");
}, /err/, "エラーメッセージにerrを含んでいないため、NG");
/* 6. */ throws( function() {
throw new CustomError("作成されたerrorMsg");
}, /err/, "エラーメッセージにerrを含んでいるため、OK");
/* 7. */ throws( function() {
throw "error"
}, "throws with just a message, not using the 'expected' argument. なにかエラーがあるとOK");
/* 8. */ throws( function() {
throw new CustomError();
}, CustomError, "raised error is an instance of CustomError. ");
/* 9. */ throws(
function() {
throw new CustomError();
}, CustomError1, "期待するCustomError1ではない関数がエラー発生させて、NG");
});

(゚ω゚)見た目だけで判断できない。デバッグすると、正規表現で判断していた。

(゚ω゚) throws 例。


(゚ω゚)期待値が無くても良いようなテストとは、エラー発生の有無しか考えられない。。。


(゚ω゚) throws のAPI Dcumantationに書いてある block って { } の事らしい。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/block


(゚ω゚) テストの判定がおかしいNGになるはずがOKの緑色に成ってる。
(゚ω゚) blockではなくfunctionしか書けないらしい。

http://api.qunitjs.com/asyncTest/
(゚ω゚)とても分かり安いサンプルプログラムを置いている。
http://himaxoff.blog111.fc2.com/blog-entry-163.html
(゚ω゚) start関数の前後に追記してみた。

var testval = 0;
asyncTest('asyncTest', function() {
setTimeout(function() {
ok(true, 'testval = ' + testval);
testval = 1;
ok(true, 'testval = ' + testval);
testval = 0.5;
start();
testval = 0.4;
}, 1000);
});
testval = 2;
test('after test', function() {
ok(true, 'testval = ' + testval);
});
testval = 3;

(゚ω゚)実行結果。
(゚ω゚) asyncTest やtestで囲むと、処理シーケンスが崩れることを覚えておこう。


http://api.qunitjs.com/start/
(゚ω゚) startの使い方は分かった。


function asyncOp() {
result="someExpectedValue1";
};
asyncOp.result="someExpectedValue2";

asyncTest("stop start test", function() {
ok(true,"(a) asyncOp.result="+asyncOp.result );
asyncOp();
ok(true,"(b) asyncOp.result="+asyncOp.result );
asyncOp.result=123;
setTimeout(function f3000() {
start(); // 最後に呼び出されるfunctionにstartを書く。
ok(true,"(d) asyncOp.result="+asyncOp.result );
equal(asyncOp.result,123,"f3000(): asyncOp.resultが123の場合はOK");
}, 3000);
setTimeout(function f1000() {
ok(true,"(c) asyncOp.result="+asyncOp.result );
equal(asyncOp.result,123,"f1000() : asyncOp.resultが123の場合はOK");
asyncOp.result=1234;
// start(); // ここにstartを置くと、f3000関数のテストがglobal failure。
}, 1000);
});
asyncOp.result="someExpectedValue3";


http://api.qunitjs.com/category/async-control/
(゚ω゚) startとstopの引数の使い方が不明。
(゚ω゚)ここまで、混ぜて使ったらいいでしょ。次のAPIを試そう・・。
20140527_225934_JST_lubuntu-14.04-desktop-amd64.iso jQuery QUnit asyncTest start stop.png

        <script type="text/javascript">
var testval = 0;
QUnit.config.testTimeout = 5000; // msec http://api.qunitjs.com/QUnit.config/
stop(); /* は、下記の関数を使っている。qunit-1.14.0.js
https://developer.mozilla.org/ja/docs/Web/API/window.clearTimeout
https://developer.mozilla.org/ja/docs/Web/API/window.setTimeout */
test('asyncTest and test : Immediately_f1', function Immediately_f() {
ok(true, 'testval = ' + testval+"  QUnitではグローバル変数を期待してはいけない。\n\
               グローバル変数は、テスト毎に初期化が必要。");
});
asyncTest('asyncTest and test : f500', function f500() {
expect(3);
setTimeout(function() {
ok(true, 'testval = ' + testval);
testval = 1;
ok(true, 'testval = ' + testval);
start(); // を置かない場合は Test timed out
testval = 0.4;
ok(true, 'testval = ' + testval);
}, 500);
});
testval = 2;
test('asyncTest and test : Immediately_f2', function Immediately_f() {
ok(true, 'testval = ' + testval);
});
testval = 3;
</script>
<script type="text/javascript">
var asyncOp;
function asyncOp(){
asyncOp.result = "asyncOp関数" + Date();
}
asyncTest("asyncTest2000", function() {
expect(3);// startを使わずにTest timed outで終わると、アサーション数は1件多い。
ok(true, "(a) asyncOp.result=" + asyncOp.result);
setTimeout(function f2000() {
ok(true, "f2000(): asyncOp.result=" + asyncOp.result);
equal(asyncOp.result, 1234, "f2000(): asyncOp.resultが1234の場合はOK");
start(); // を置かない場合は Test timed out
}, 2000);
/* 同じ1秒にしても、他のテストが混じる事は無かった */
});
asyncOp.result = "someExpectedValue2";
asyncTest("asyncTest1000", function() {
expect(4);
ok(true, "(b) asyncOp.result=" + asyncOp.result);
asyncOp();
ok(true, "(c) asyncOp.result=" + asyncOp.result);
asyncOp.result = 123;
setTimeout(function f1000() {
ok(true, "f1000(): asyncOp.result=" + asyncOp.result);
equal(asyncOp.result, 123, "f1000(): asyncOp.resultが123の場合はOK");
asyncOp.result = 1234;
start(); // を置かない場合は Test timed out
}, 1000);
});
asyncOp.result = "someExpectedValue3";
</script>

http://builder.japan.zdnet.com/script/sp_javascript-kickstart-2007/20373861/1/
JavaScriptの変数のスコープについて学ぶ - builder by ZDNet Japan:

http://api.qunitjs.com/QUnit.begin/
http://api.qunitjs.com/QUnit.done/
http://api.qunitjs.com/module/

(゚ω゚)の使い方。
20140528_101714_JST_lubuntu-14.04-desktop-amd64.iso jQuery QUnit.begin QUnit.done moduleの使い方.png


http://api.qunitjs.com/QUnit.log/
(゚ω゚) QUnit.logは、ログのフォーマットを書いた関数を渡すだけ。


http://api.qunitjs.com/QUnit.moduleStart/
http://api.qunitjs.com/QUnit.moduleDone/

(゚ω゚)これも簡単APIだった。


http://api.qunitjs.com/QUnit.testStart/
http://api.qunitjs.com/QUnit.testDone/

(゚ω゚)これも簡単APIだった。


http://api.qunitjs.com/module/
(゚ω゚) moduleのsetupとteadownは、癖がある。
http://dev.classmethod.jp/etc/javascript_testing_framework_qunit/
javascriptのテストのはなし:QUnit | Developers.IO:
>その前にテスト対象のクラスとしてHogeを作っておきます。
(゚ω゚) これは良いhogeなので、Hoge.jsを作る

var Hoge = function(){};
Hoge.prototype.add = function(param1, param2){
return param1 + param2;
};
Hoge.prototype.package = function(param1, param2){
return {p1:param1, p2:param2};
};
Hoge.prototype.throwError = function(){
throw new Error();
};


http://dev.classmethod.jp/etc/javascript_testing_framework_qunit-2/
javascriptのテストのはなし:QUnit(その2) | Developers.IO:
(゚ω゚) に載っていたソースを参考に、setupとteadownを使ってみた。

(゚ω゚)作ったHoge.jsはここに置く。
<head>
<title>QUnit panic</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="resources/jquery-2.1.1.js"></script>
<link rel="stylesheet" href="resources/qunit-1.14.0.css">
<script src="resources/qunit-1.14.0.js"></script>
<script src="Hoge.js"></script>
</head>

(゚ω゚)下記のコードは bodyのscriptへ
/*
* http://api.qunitjs.com/module/
* setup: と teardown: の使い方
*/
var teardownValue = 0;
module("●テストが無いから処理が来ない。", {
setup: function() {
console.log("テストが無いから、ここには来ない。 setup : teardownValue=",
teardownValue);
},
teardown: function() {
console.log("テストが無いから、ここには来ない。 teardown : teardownValue=",
teardownValue);
}
});
test("てすと", function() {
ok(true,"testを書くと setup、test、teardown の順に呼ばれる。");
});
var hoge = 1;
//まとまりを作るだけ
module("●ModuleA");
test("teardownExample_test1", function() {
deepEqual(hoge,1,"変数hogeはF5キーを押すたびに、1とHogeを繰り返す。");
hoge = new Hoge();
notEqual(hoge.add(1, 2), 4);
hoge = null;
});
//setUpとtearDownを定義
module("●ModuleB", {
setup: function() {
hoge = new Hoge();
console.log("--ModuleB setup : hoge=", hoge);
},
teardown: function() {
// hoge = null;
console.log("--ModuleB teardown : hoge=", hoge);
}
});
test("teardownExample_test2", function() {
notDeepEqual(hoge.package("test1", "test2"), {p1: "test2", p2: "test1"});
});
test("teardownExample_test3", function() {
var hoge2 = new Hoge();
notStrictEqual(hoge, hoge2);
deepEqual(hoge, 1," グローバルhogeはオブジェクトに成っていた。");
// deepEqual(hoge.package, {p1: "test3", p2: "test4"});
});
module("●ModuleC");
test("test4", function() {
equal(hoge, null , "nullを代入してる行をコメントにしてみた");
});



http://api.qunitjs.com/QUnit.assert/
(゚ω゚)こう書いても一緒。


http://api.qunitjs.com/QUnit.config/
(゚ω゚) QUnit.config.altertitle = true; // なにを渡しても変化無し。 qunit-1.14.0.js
(゚ω゚) テスト毎のアイコン表示(見てくれ)が変わるという、どうでも良いコンフィグである。

(゚ω゚) QUnit.config.autostartは、スクリプト例に
Example: Disable autostart, useful when loading tests asynchronsly, here using requirejs:
(゚ω゚) と、書いてる。here using requirejs と書けば分かると思っている人は2流である。
(゚ω゚)プロではない。プロは、全ての人へ自分の思っている事を伝えるために
(゚ω゚) 「RequireJS の参照先は、http://requirejs.org/ 」と記述する。
(゚ω゚) RequireJS は QUnitではなく、別のライブラリなので、なおさら、参照先を記述すべき。

(゚ω゚) 調べてみるとRequireJS は、jsファイルを読み込む"Loader"だった。
http://www.php.net/manual/ja/function.require.php
(゚ω゚) PHPのrequire的な、includeのようなモノらしい。

(゚ω゚) QUnit.config.autostart = false テスト結果。
(゚ω゚) 結局、start()はテストの終わりに書かなければならない。



(゚ω゚) QUnit.config.current.testName の使い方


(゚ω゚) QUnit.config.urlConfig の使い方

(゚ω゚) Apacheのアクセスログ。
(゚ω゚) 最初のログはF5キー押下。続いて1.8.3を選らんだ時のログが赤い部分。
(゚ω゚) PHPUnitとの連動が可能のように思える。やっとブログタイトルへ辿りついた。
ubuntu@ubuntu-VirtualBox:/var/log/apache2$ tail -f access.log


127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/QUnitExamples.html HTTP/1.1" 200 6673 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/resources/qunit-1.14.0.css HTTP/1.1" 200 1676 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/resources/qunit-1.14.0.js HTTP/1.1" 200 17681 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/Hoge.js HTTP/1.1" 200 495 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/tests/speedTest.js HTTP/1.1" 200 873 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/resources/jquery-2.1.1.js HTTP/1.1" 200 73693 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:27 +0900] "GET /PhpProject9/tests/monchouchou_cake01.jpg?1401655467404 HTTP/1.1" 200 84779 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:35 +0900] "GET /PhpProject9/QUnitExamples.html?jquery=1.8.3 HTTP/1.1" 200 6673 "http://localhost/PhpProject9/QUnitExamples.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
127.0.0.1 - - [02/Jun/2014:05:44:35 +0900] "GET /PhpProject9/tests/monchouchou_cake01.jpg?1401655475856 HTTP/1.1" 200 84779 "http://localhost/PhpProject9/QUnitExamples.html?jquery=1.8.3" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"


http://api.qunitjs.com/QUnit.extend/
(゚ω゚) 134行目で base と QUnit.extend の値をコンソール表示してみた。 
(゚ω゚) QUnit.extend() を使うと、オブジェクトのプロパティを変更・削除できる。

https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/in
概要
in 演算子は、指定されたプロパティが指定されたオブジェクトにある場合に true を返します。

http://api.qunitjs.com/QUnit.init/
http://api.qunitjs.com/QUnit.reset/

(゚ω゚)QUnit.resetしてからQUnit.initするらしい。
(゚ω゚)ここにサンプルが参考になる。
http://stackoverflow.com/questions/9412153/how-to-reset-status-in-qunit


http://api.qunitjs.com/QUnit.jsDump.parse/
(゚ω゚) ここにも論理和してる。変数のundefined checkということだろうか?
(゚ω゚) 今のブラウザは型チェックはしてないのだが、今後は型チェックが実装されるという意味?
(゚ω゚) stackは非公開の引数なので、QUnitで使ってるワーク用の変数。

(゚ω゚) 実行結果parsed には、同じ値が入るから良いのか・・


http://api.qunitjs.com/QUnit.push/
(゚ω゚)カスタムアサートということか。
(゚ω゚)これでQUnitのAPIは全て理解した事になる。次はexValidationか・・・

(゚ω゚)当ブログとほぼ同じ内容だが、ツイッターのURLも貼っておく。
https://twitter.com/kai_ri_no/status/469674095106207745