/*
 * This file is included in all mini jsunit test cases.  The test
 * framework expects lines that signal failed tests to start with
 * the f-word and ignore all other lines.
 */

// Avoid writing the f-word, since some tests output parts of this code.
var the_f_word = "Fai" + "lure";

function fail(expected, found, name_opt) {
  var start;
  if (name_opt) {
    start = the_f_word + " (" + name_opt + "): ";
  } else {
    start = the_f_word + ":";
  }
  print(start + " expected <" + expected + "> found <" + found + ">");
}


function assertEquals(expected, found, name_opt) {
  if (expected != found) {
    fail(expected, found, name_opt);
  }
}


function assertArrayEquals(expected, found, name_opt) {
  var start = "";
  if (name_opt) {
    start = name_opt + " - ";
  }
  assertEquals(expected.length, found.length, start + "array length");
  if (expected.length == found.length) {
    for (var i = 0; i < expected.length; ++i) {
      assertEquals(expected[i], found[i], start + "array element at index " + i);
    }
  }
}


function assertTrue(value, name_opt) {
  assertEquals(true, value, name_opt);
}


function assertFalse(value, name_opt) {
  assertEquals(false, value, name_opt);
}


function assertNaN(value, name_opt) {
  if (!isNaN(value)) {
    fail("NaN", value, name_opt);
  }
}


function assertThrows(code) {
  try {
    eval(code);
    assertTrue(false, "did not throw exception");
  } catch (e) {
    // Do nothing.
  }
}


function assertInstanceof(obj, type) {
  if (!(obj instanceof type)) {
    assertTrue(false, "Object <" + obj + "> is not an instance of <" + type + ">");
  }
}


function assertDoesNotThrow(code) {
  try {
    eval(code);
  } catch (e) {
    assertTrue(false, "threw an exception");
  }
}


function assertUnreachable(name_opt) {
  var message = the_f_word + ": unreachable"
  if (name_opt) {
    message += " - " + name_opt;
  }
  print(message);
}