/* ASSERTIONS */
var test_failed = false;
function log(str, color){
   var newline = document.createElement("li");
   var span = document.createElement("span");
   span.style.color = color || "black";
   span.innerText = str;
   newline.appendChild(span);
   document.getElementById("stdout").appendChild(newline);
 }
function assert_(b, str){
   if (!b) {
      test_failed = true;
      log(str, "red")
   }
}
function assertEqual(a,b){
   if (a!=b) {
      test_failed = true;
      log("["+a+"] is expected but got ["+b+"] ", "red");
   }
}
function assertTextField(input, valid_text){
   var texts = input.split(" ");
   for (var i=0;i<texts.length;i++)
      input_string(texts[i]);
   assertEqual(valid_text, textfield);
   textfield = "";
}

/* textfield emulator */
var textfield = "";
var cursor_idx = 0;

function exec_text_operator_test(textop_orig){
   var textop = {kana:textop_orig.kana, num:textop_orig.num};
   if (typeof(textop_orig.kana) == typeof([])) {
      textop.kana = textop_orig.kana[0];
   }
   var start = cursor_idx;
   textfield = (textfield.slice(0,start-textop.num)+
                textop.kana+textfield.slice(start));
   cursor_idx = start-textop.num+textop.kana.length;
}
function input_char(c){
   var r = skk.input_char(c)
   exec_text_operator_test(r);
}
function input_string(text){
   for (var i=0;i<text.length;i++){
      input_char(text[i]);
   }
}
function hit_space_test(){
   exec_text_operator_test(skk.hit_space());
}
function hit_backspace_test(){
   exec_text_operator_test(skk.hit_backspace());
}

/* TEST CASES */
function reset(){
   cursor_idx = 0;
   skk.reset_me();
   textfield = "";
}
function test_alpha_input(){
   skk.switch_to_alpha();
   assertTextField("hoge","hoge");reset();
}
function test_hiragana_input(){
   skk.switch_to_hira();
   assertTextField("a", "あ");reset();
   assertTextField("ka", "か");reset();
   assertTextField("kya", "きゃ");reset();
   assertTextField("ksa", "さ");reset();
   assertTextField("hsta", "た");reset();
   assertTextField("haruyasumi", "はるやすみ");reset();
   assertTextField("natsuyasumi", "なつやすみ");reset();
   assertTextField("kekka", "けっか");reset();
   assertTextField("nn", "ん");reset();
   assertTextField("tanbo", "たんぼ");reset();
   assertTextField("tannbo", "たんぼ");reset();
   assertTextField("ma-bo-", "まーぼー");reset();
   assertTextField("va", "う゛ぁ");reset();
   assertTextField("shasyusho", "しゃしゅしょ");reset();
   assertTextField("nari", "なり");reset();
   assertTextField("hansinhangi", "はんしんはんぎ");reset();
   assertTextField("aiueo", "あいうえお");reset();
}
function test_katakana_input(){
   skk.switch_to_kata();
   assertTextField("a", "ア");reset();
}

function test_kanji_input(){
   skk.switch_to_hira();
   input_string("Kataki");hit_space_test();
   assertTextField("uti", "敵うち");reset();
   assertTextField("HashiRu", "走る");reset();
   assertTextField("oTsukaI", "お使い");reset();
   assertTextField("AU", "合う");reset();
   input_string("Konnnyaku");hit_space_test();
   assertEqual("菎蒻", textfield);reset();

   input_string("Buta");hit_space_test();
   input_string("noKakuni");hit_space_test();
   assertEqual("豚の角煮", textfield);reset();
   input_string("Seiten");hit_space_test();
   input_string("nari");
   assertEqual("晴天なり", textfield);reset();
   input_string("haSeiten");hit_space_test();
   input_string("nari");
   assertEqual("は晴天なり", textfield);reset();
   input_string("Soutei");hit_space_test();
   input_string("noHanni");hit_space_test();
   input_string("Gai");hit_space_test();
   input_string("desu");
   assertEqual("想定の範囲外です", textfield);reset();
   input_string("Konnkai");hit_space_test();
   input_string("niKannSuruGijututeki");hit_space_test();
   input_string("Shousai");hit_space_test();
   input_string("woKabun");hit_space_test();
   input_string("nishite");
   assertEqual("今回に関する技術的詳細を寡聞にして", textfield);reset();
                   
   input_string("Kekka");hit_space_test();
   assertEqual("結果", textfield);reset();
   input_string("Honjitsu");hit_space_test();
   assertEqual("本日", textfield);reset();
   input_string("Gishinnanki");hit_space_test();
   assertEqual("疑心暗鬼", textfield);reset();
   input_string("Hanshinhangi");hit_space_test();
   assertEqual("半信半疑", textfield);reset();
}
function test_skkdic(){
   skk.switch_to_hira();
   var hashir1 = skkdic_okuri["走r"];
   input_string("HashiRu");
   var hashir2 = skkdic_okuri["走r"];
   assertEqual(hashir1, hashir2);
}
function test_backspace(){
   skk.switch_to_hira();
   input_string("Nihonn");
   assertEqual("▽にほん", textfield);
   hit_backspace_test();
   hit_backspace_test();
   assertEqual("▽に", textfield);
   hit_backspace_test();
   assertEqual("", textfield);
}
function test_dynamic_translation(){
   skk.switch_to_hira();
   input_string("Kyou");
   hit_space_test();
   assertEqual(today()[0], textfield);
}
function test_translation(){
   skk.switch_to_hira();
   input_string("aKyou");
   hit_space_test();hit_space_test();hit_space_test();
   assertEqual("あ今日", textfield);
   hit_space_test();
   assertEqual("あ京", textfield);
}
function test_hanpa(){
   skk.switch_to_hira();
   input_char("A");
   input_char("t");
   input_char("u");
   assertEqual("▽あつ", textfield);
   input_char("M");
   assertEqual("▽あつm", textfield);
   input_char("i");
   hit_space_test();
   assertEqual("▽厚み", textfield);reset();
}

/* RUN TESTS */
var count = 0;
var tests = [];
for (var method in this)
   if (method.indexOf("test_") == 0 && typeof(this[method]) == "function")
      tests.push(method);
function try_a_test(){
   if (tests.length == 0)
      return log("Ran "+count+" test(s)");

   var method_name = [tests.shift()];
   count += 1;
   try {
      this[method_name]();
   } catch(e) {
      test_failed = true;
      log("Exception: "+e, "red");
   }
   if (test_failed) {
      log("Test "+method+" was failed.", "red");
      test_failed = false;
   } else {
      log("Test "+method_name+" was successfully finished.", "green");
   }
   reset();
   setTimeout(try_a_test,0);
}
try_a_test();

/* FOR DEBUG */
document.getElementById("input").addEventListener("keyup",function(e){
   document.getElementById("roman_buffer").innerText = skk.r2k.roman_buffer;
   document.getElementById("hiragana_buffer").innerText = skk.hiragana_buffer;
}, true);
skk.switch_to_alpha();

