script.aculo.usを読み解く

第10回 unittest.js(後編)

この記事を読むのに必要な時間:およそ 12 分

0333:  assertNull: function(obj) {
0334:    var message = arguments[1] || 'assertNull'
0335:    try { (obj==null) ? this.pass() : 
0336:      this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
0337:    catch(e) { this.error(e); }
0338:  },

333~338行目のassertNullは,オブジェクトが必ずnullであるというアサートです。

0339:  assertMatch: function(expected, actual) {
0340:    var message = arguments[2] || 'assertMatch';
0341:    var regex = new RegExp(expected);
0342:    try { (regex.exec(actual)) ? this.pass() :
0343:      this.fail(message + ' : regex: "' +  Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
0344:    catch(e) { this.error(e); }
0345:  },

339~345行目のassertMatchは,"正規表現の文字列","実際の文字列"として,その正規表現が必ずマッチするというアサートです。

0346:  assertHidden: function(element) {
0347:    var message = arguments[1] || 'assertHidden';
0348:    this.assertEqual("none", element.style.display, message);
0349:  },

346~349行目のassertHiddenは,要素が必ず非表示であるというアサートです。要素のCSSのdisplay属性が必ず"none"と等しいとします。

0350:  assertNotNull: function(object) {
0351:    var message = arguments[1] || 'assertNotNull';
0352:    this.assert(object != null, message);
0353:  },

350~353行目のassertNotNullは,assertNullの反対で,オブジェクトが必ずnullでないというアサートです。

0354:  assertType: function(expected, actual) {
0355:    var message = arguments[2] || 'assertType';
0356:    try { 
0357:      (actual.constructor == expected) ? this.pass() : 
0358:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
0359:        '", actual "' + (actual.constructor) + '"'); }
0360:    catch(e) { this.error(e); }
0361:  },

354~361行目のassertTypeは,"予想のコンストラクタ","実際の値"として,必ずそのコンストラクタの値であるというアサートですCore JavaScript 1.5 Reference:Object:constructor⁠。

0362:  assertNotOfType: function(expected, actual) {
0363:    var message = arguments[2] || 'assertNotOfType';
0364:    try { 
0365:      (actual.constructor != expected) ? this.pass() : 
0366:      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
0367:        '", actual "' + (actual.constructor) + '"'); }
0368:    catch(e) { this.error(e); }
0369:  },

362~369行目のassertNotOfTypeは,assertTypeの反対で,"予想のコンストラクタ","実際の値"として,必ずそのコンストラクタの値でないというアサートです。

0370:  assertInstanceOf: function(expected, actual) {
0371:    var message = arguments[2] || 'assertInstanceOf';
0372:    try { 
0373:      (actual instanceof expected) ? this.pass() : 
0374:      this.fail(message + ": object was not an instance of the expected type"); }
0375:    catch(e) { this.error(e); } 
0376:  },

370~376行目のassertInstanceOfは,"予想の型","実際の値"として,必ずその型の値であるというアサートです。

0377:  assertNotInstanceOf: function(expected, actual) {
0378:    var message = arguments[2] || 'assertNotInstanceOf';
0379:    try { 
0380:      !(actual instanceof expected) ? this.pass() : 
0381:      this.fail(message + ": object was an instance of the not expected type"); }
0382:    catch(e) { this.error(e); } 
0383:  },

377~383行目のassertNotInstanceOfは,assertInstanceOfの反対で,"予想の型","実際の値"として,必ずその型の値でないというアサートです。

0384:  assertRespondsTo: function(method, obj) {
0385:    var message = arguments[2] || 'assertRespondsTo';
0386:    try {
0387:      (obj[method] && typeof obj[method] == 'function') ? this.pass() : 
0388:      this.fail(message + ": object doesn't respond to [" + method + "]"); }
0389:    catch(e) { this.error(e); }
0390:  },

384~390行目のassertRespondsToは,"メソッド名","オブジェクト"として,そのメソッドが必ずあるというアサートです。

0391:  assertReturnsTrue: function(method, obj) {
0392:    var message = arguments[2] || 'assertReturnsTrue';
0393:    try {
0394:      var m = obj[method];
0395:      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
0396:      m() ? this.pass() : 
0397:      this.fail(message + ": method returned false"); }
0398:    catch(e) { this.error(e); }
0399:  },

391~399行目のassertReturnsTrueは,"メソッド名","オブジェクト"として,そのメソッドを呼ぶと必ずtrueを返すというアサートです。

0400:  assertReturnsFalse: function(method, obj) {
0401:    var message = arguments[2] || 'assertReturnsFalse';
0402:    try {
0403:      var m = obj[method];
0404:      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
0405:      !m() ? this.pass() : 
0406:      this.fail(message + ": method returned true"); }
0407:    catch(e) { this.error(e); }
0408:  },

400~408行目のassertReturnsFalseは,assertReturnsTrueの反対で,"メソッド名","オブジェクト"として,そのメソッドを呼ぶと必ずfalseを返すというアサートです。

0409:  assertRaise: function(exceptionName, method) {
0410:    var message = arguments[2] || 'assertRaise';
0411:    try { 
0412:      method();
0413:      this.fail(message + ": exception expected but none was raised"); }
0414:    catch(e) {
0415:      ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); 
0416:    }
0417:  },

409~417行目のassertRaiseは,"例外の名前"(nullでも構いません⁠⁠,"関数"として,その関数を呼ぶと必ずその名前の例外が発生するというアサートです。nullを指定したときは,とにかく例外が発生すれば成立します。

0418:  assertElementsMatch: function() {
0419:    var expressions = $A(arguments), elements = $A(expressions.shift());
0420:    if (elements.length != expressions.length) {
0421:      this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
0422:      return false;
0423:    }
0424:    elements.zip(expressions).all(function(pair, index) {
0425:      var element = $(pair.first()), expression = pair.last();
0426:      if (element.match(expression)) return true;
0427:      this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
0428:    }.bind(this)) && this.pass();
0429:  },

418~429行目のassertElementsMatchは,1番めの引数に要素の配列を,残りの引数に,その配列の長さと同じだけのCSSセレクタの文字列をとって,それぞれの要素がそれぞれのCSSセレクタにElement.matchで必ずマッチするというアサートです。

0430:  assertElementMatches: function(element, expression) {
0431:    this.assertElementsMatch([element], expression);
0432:  },

430~432行目のassertElementMatchesは,assertElementsMatchの単数形です。引数に要素とCSSセレクタの文字列をとって,その要素がそのCSSセレクタにElement.matchで必ずマッチするというアサートです。

著者プロフィール

源馬照明(げんまてるあき)

名古屋大学大学院多元数理科学研究科1年。学部生のときにSchemeの素晴らしさを知ったのをきっかけに,関数型言語の世界へ。JavaScriptに,ブラウザからすぐに試せる関数型言語としての魅力と将来性を感じている。

ブログ:Gemmaの日記