/**
 * jp.rinco.test: JavaScript test lib
 * @see prototype-1.6.0.js
 * @author Toshio Yamashita (yamachan)
 * @licence 3-clause BSD license
 */

if (!jp) {var jp = {};}
if (!jp.rinco) {jp.rinco = {};}

if (!jp.rinco.test) {jp.rinco.test = {
	author: "Toshio Yamashita (yamachan)",
	mail: "z@rinco.jp",
	version: "1.0.0",
	lastUpdate: "2008/08/25"
}}

jp.rinco.test.enableAutoTest = true;
jp.rinco.test.classNameOk = 'ok';
jp.rinco.test.classNameNg = 'ng';
jp.rinco.test.selectAutoTest = '.jp_rinco_test_autoTest';
jp.rinco.test.selectTitle = '.title';
jp.rinco.test.selectInit = '.init';
jp.rinco.test.selectTest = '.test';
jp.rinco.test.selectCode = '.code';
jp.rinco.test.selectCodeValue = '';
jp.rinco.test.selectExpect = '.expect';
jp.rinco.test.selectExpectValue = '';
jp.rinco.test.selectResult = '.result';
jp.rinco.test.selectResultValue = '';
jp.rinco.test.enableAutoTestExpand = true;

jp.rinco.test.autoTest = function(t, i){
	t = $(t);
	if (!$(t)) return;
	i = i==undefined ? '' : '{'+i+'};'
	var code = t.down(jp.rinco.test.selectCode);
	var expect = t.down(jp.rinco.test.selectExpect);
	var result = t.down(jp.rinco.test.selectResult)
	if (!code || !expect || !result) return false;
	code = jp.rinco.test.selectCodeValue=='' ? code : code.down(jp.rinco.test.selectCodeValue);
	expect = jp.rinco.test.selectExpectValue=='' ? expect : expect.down(jp.rinco.test.selectExpectValue);
	result = jp.rinco.test.selectResultValue=='' ? result : result.down(jp.rinco.test.selectResultValue);
	if (!code || !expect || !result) return false;

	var ret;
	try {
		ret = eval(i + (code.innerHTML.stripTags()).unescapeHTML());
		ret = typeof(ret)=="number" && isNaN(ret) ? "NaN" : Object.toJSON(ret);
		result.innerHTML = '<pre>' + ret + '</pre>';
	} catch (e) {
		ret = e.name;
		result.innerHTML = '<pre>' + ret + '<br/>' + e.message + '</pre>';
	}
	return (expect.innerHTML.stripTags()).unescapeHTML() === ret;
}

jp.rinco.test.autoTests = function(){
	$$(jp.rinco.test.selectAutoTest).each(function(test){
		var title = test.down(jp.rinco.test.selectTitle);
		if (title) {
			var init = test.down(jp.rinco.test.selectInit);
			init = init ? init.innerHTML : "";
			var flag = true;
			test.select(jp.rinco.test.selectTest).each(function(t){
				var ret = jp.rinco.test.autoTest(t, init);
				t.addClassName(ret ? jp.rinco.test.classNameOk : jp.rinco.test.classNameNg);
				flag = flag && ret;
			});
			title.addClassName(flag ? jp.rinco.test.classNameOk : jp.rinco.test.classNameNg);
		}		
	});
	if(jp.rinco.test.enableAutoTestExpand && jp.rinco.ui.expandableElement) {
		var el = new jp.rinco.ui.elementList();
		el.expandableElement = new jp.rinco.ui.expandableElement();
		el.expandableElement.target = jp.rinco.test.selectInit;
		el.expandableElement.target2 = 'table';
		el.pushAll(document.body, jp.rinco.test.selectAutoTest);
		el.updateExpand(function(e){
			var title = e.down(jp.rinco.test.selectTitle);
			return title.hasClassName(jp.rinco.test.classNameNg);
		});
		jp.rinco.test.AutoTestElementList = el;
		var p = $('jp_rinco_test_autoTestPanel');
		if (p) {
			p.select('.expandall').each(function(e){
				Event.observe(e, 'click', function(){
					jp.rinco.test.AutoTestElementList.expandAll();
				});
			});
			p.select('.collapseall').each(function(e){
				Event.observe(e, 'click', function(){
					jp.rinco.test.AutoTestElementList.collapseAll();
				});
			});
		}
	}
}


jp.rinco.test.autoTestObserve = function(){
	if(jp.rinco.test.enableAutoTest)
		jp.rinco.test.autoTests();
}

if (jp.rinco.observeList)
	jp.rinco.observeList.push(jp.rinco.test.autoTestObserve);
else
	Event.observe(window, 'load', jp.rinco.test.autoTestObserve);


