<!doctype html>
<title>message clone</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../support/compare.js"></script>
<div id=log></div>
<script>
  var err = new Error('foo');
  var date = new Date();

  var test_array = [ undefined,
                     null,
                     false,
                     true,
                     1,
                     NaN,
                     Infinity,
                     'foo',
                     date,
                     /foo/,
                     null/*self*/,
                     null/*err*/];

  var cloned_array = [ undefined,
                       null,
                       false,
                       true,
                       1,
                       NaN,
                       Infinity,
                       'foo',
                       date,
                       /foo/,
                       null/*self*/,
                       null/*err*/];

  var test_object = {a: undefined,
                     b: null,
                     c: false,
                     d: true,
                     e: 1,
                     f: NaN,
                     g: Infinity,
                     h: 'foo',
                     i: date,
                     j: /foo/,
                     k: null/*self*/,
                     l: [],
                     m: {},
                     n: null /*err*/};

  var cloned_object = {a:undefined, b:null, c:false, d:true, e:1, f:NaN, g:Infinity, h:'foo', i: date, j: /foo/,  k:null, l: [], m: {}, n:null};

  var tests = [undefined, null,
               false, true,
               1, NaN, Infinity,
               'foo',
               date,
               /foo/,
               /* ImageData, File, FileData, FileList, */
               null /*self*/,
               test_array,
               test_object,
               null /*err*/];

  for (var i = 0; i < tests.length; ++i) {
    postMessage(tests[i], '*', []);
  }

  var test_undefined = async_test('undefined');
  var test_null = async_test('null');
  var test_false = async_test('false');
  var test_true = async_test('true');
  var test_1 = async_test('1');
  var test_NaN = async_test('NaN');
  var test_Infinity = async_test('Infinity');
  var test_string = async_test('string');
  var test_date = async_test('date');
  var test_regex = async_test('regex');
  var test_self = async_test('self');
  var test_array = async_test('array');
  var test_object = async_test('object');
  var test_error = async_test('error');
  var test_unreached = async_test('unreached');

  var j = 0;
  onmessage = function(e) {
    switch (j) {
      case 0: test_undefined.step(function() { assert_equals(e.data, undefined); this.done(); }); break;
      case 1: test_null.step(function() { assert_equals(e.data, null); this.done(); }); break;
      case 2: test_false.step(function() { assert_false(e.data); this.done(); }); break;
      case 3: test_true.step(function() { assert_true(e.data); this.done(); }); break;
      case 4: test_1.step(function() { assert_equals(e.data, 1); this.done(); }); break;
      case 5: test_NaN.step(function() { assert_equals(e.data, NaN); this.done(); }); break;
      case 6: test_Infinity.step(function() { assert_equals(e.data, Infinity); this.done(); }); break;
      case 7: test_string.step(function() { assert_equals(e.data, 'foo'); this.done(); }); break;
      case 8: test_date.step(function() { assert_true(sameDate(e.data, date)); this.done(); }); break;
      case 9: test_regex.step(function() { assert_equals('' + e.data, '/foo/'); assert_equals(e.data instanceof RegExp, true, 'e.data instanceof RegExp'); this.done(); }); break;
      // not testing it any more, as cloning host objects will now raise exceptions. TODO: add (exceptional) tests for these.
      case 10: test_self.step(function() { assert_equals(e.data, null); this.done(); }); break;
      case 11: test_array.step(function() { assert_array_equals_(e.data, cloned_array, 'array'); this.done(); }); break;
      case 12: test_object.step(function() { assert_object_equals_(e.data, cloned_object, 'object'); this.done(); }); break;
      case 13:
        test_error.step(function() { assert_equals(e.data, null, 'new Error()'); this.done(); });
        setTimeout(test_unreached.step_func(function() { assert_equals(j, 14); this.done(); }), 50);
        break;
      default: test_unreached.step(function() { assert_unreached('got an unexpected message event ('+j+')'); });
    };
    j++;
  }


</script>
