1(function() {
2  if (typeof document == 'undefined') return;
3
4  var _ = typeof require == 'function' ? require('..') : window._;
5
6  QUnit.module('Cross Document');
7  /* global iObject, iElement, iArguments, iFunction, iArray, iError, iString, iNumber, iBoolean, iDate, iRegExp, iNaN, iNull, iUndefined, ActiveXObject */
8
9  // Setup remote variables for iFrame tests.
10  var iframe = document.createElement('iframe');
11  iframe.frameBorder = iframe.height = iframe.width = 0;
12  document.body.appendChild(iframe);
13  var iDoc = (iDoc = iframe.contentDocument || iframe.contentWindow).document || iDoc;
14  iDoc.write(
15    [
16      '<script>',
17      'parent.iElement = document.createElement("div");',
18      'parent.iArguments = (function(){ return arguments; })(1, 2, 3);',
19      'parent.iArray = [1, 2, 3];',
20      'parent.iString = new String("hello");',
21      'parent.iNumber = new Number(100);',
22      'parent.iFunction = (function(){});',
23      'parent.iDate = new Date();',
24      'parent.iRegExp = /hi/;',
25      'parent.iNaN = NaN;',
26      'parent.iNull = null;',
27      'parent.iBoolean = new Boolean(false);',
28      'parent.iUndefined = undefined;',
29      'parent.iObject = {};',
30      'parent.iError = new Error();',
31      '</script>'
32    ].join('\n')
33  );
34  iDoc.close();
35
36  QUnit.test('isEqual', function(assert) {
37
38    assert.notOk(_.isEqual(iNumber, 101));
39    assert.ok(_.isEqual(iNumber, 100));
40
41    // Objects from another frame.
42    assert.ok(_.isEqual({}, iObject), 'Objects with equivalent members created in different documents are equal');
43
44    // Array from another frame.
45    assert.ok(_.isEqual([1, 2, 3], iArray), 'Arrays with equivalent elements created in different documents are equal');
46  });
47
48  QUnit.test('isEmpty', function(assert) {
49    assert.notOk(_([iNumber]).isEmpty(), '[1] is not empty');
50    assert.notOk(_.isEmpty(iArray), '[] is empty');
51    assert.ok(_.isEmpty(iObject), '{} is empty');
52  });
53
54  QUnit.test('isElement', function(assert) {
55    assert.notOk(_.isElement('div'), 'strings are not dom elements');
56    assert.ok(_.isElement(document.body), 'the body tag is a DOM element');
57    assert.ok(_.isElement(iElement), 'even from another frame');
58  });
59
60  QUnit.test('isArguments', function(assert) {
61    assert.ok(_.isArguments(iArguments), 'even from another frame');
62  });
63
64  QUnit.test('isObject', function(assert) {
65    assert.ok(_.isObject(iElement), 'even from another frame');
66    assert.ok(_.isObject(iFunction), 'even from another frame');
67  });
68
69  QUnit.test('isArray', function(assert) {
70    assert.ok(_.isArray(iArray), 'even from another frame');
71  });
72
73  QUnit.test('isString', function(assert) {
74    assert.ok(_.isString(iString), 'even from another frame');
75  });
76
77  QUnit.test('isNumber', function(assert) {
78    assert.ok(_.isNumber(iNumber), 'even from another frame');
79  });
80
81  QUnit.test('isBoolean', function(assert) {
82    assert.ok(_.isBoolean(iBoolean), 'even from another frame');
83  });
84
85  QUnit.test('isFunction', function(assert) {
86    assert.ok(_.isFunction(iFunction), 'even from another frame');
87  });
88
89  QUnit.test('isDate', function(assert) {
90    assert.ok(_.isDate(iDate), 'even from another frame');
91  });
92
93  QUnit.test('isRegExp', function(assert) {
94    assert.ok(_.isRegExp(iRegExp), 'even from another frame');
95  });
96
97  QUnit.test('isNaN', function(assert) {
98    assert.ok(_.isNaN(iNaN), 'even from another frame');
99  });
100
101  QUnit.test('isNull', function(assert) {
102    assert.ok(_.isNull(iNull), 'even from another frame');
103  });
104
105  QUnit.test('isUndefined', function(assert) {
106    assert.ok(_.isUndefined(iUndefined), 'even from another frame');
107  });
108
109  QUnit.test('isError', function(assert) {
110    assert.ok(_.isError(iError), 'even from another frame');
111  });
112
113  if (typeof ActiveXObject != 'undefined') {
114    QUnit.test('IE host objects', function(assert) {
115      var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
116      assert.notOk(_.isNumber(xml));
117      assert.notOk(_.isBoolean(xml));
118      assert.notOk(_.isNaN(xml));
119      assert.notOk(_.isFunction(xml));
120      assert.notOk(_.isNull(xml));
121      assert.notOk(_.isUndefined(xml));
122    });
123
124    QUnit.test('#1621 IE 11 compat mode DOM elements are not functions', function(assert) {
125      var fn = function() {};
126      var xml = new ActiveXObject('Msxml2.DOMDocument.3.0');
127      var div = document.createElement('div');
128
129      // JIT the function
130      var count = 200;
131      while (count--) {
132        _.isFunction(fn);
133      }
134
135      assert.equal(_.isFunction(xml), false);
136      assert.equal(_.isFunction(div), false);
137      assert.equal(_.isFunction(fn), true);
138    });
139  }
140
141}());
142