(function() { //inheritance tests test(function() { var event = new DeviceLightEvent(''); assert_true(event instanceof window.DeviceLightEvent); }, 'the event is an instance of DeviceLightEvent'); test(function() { var event = new DeviceLightEvent(''); assert_true(event instanceof window.Event); }, 'the event inherits from Event'); //Type attribute tests test(function() { assert_throws(new TypeError(), function() { new DeviceLightEvent(); }, 'First argument is required, so was expecting a TypeError.'); }, 'Missing type argument'); test(function() { var event = new DeviceLightEvent(undefined); assert_equals(event.type, 'undefined'); }, 'Event type set to undefined'); test(function() { var event = new DeviceLightEvent(null); assert_equals(event.type, 'null'); }, 'type argument is null'); test(function() { var event = new DeviceLightEvent(123); assert_equals(event.type, '123'); }, 'type argument is number'); test(function() { var event = new DeviceLightEvent(new Number(123)); assert_equals(event.type, '123'); }, 'type argument is Number'); test(function() { var event = new DeviceLightEvent([]); assert_equals(event.type, ''); }, 'type argument is array'); test(function() { var event = new DeviceLightEvent(new Array()); assert_equals(event.type, ''); }, 'type argument is instance of Array'); test(function() { var event = new DeviceLightEvent(['t', ['e', ['s', ['t']]]]); assert_equals(event.type, 't,e,s,t'); }, 'type argument is nested array'); test(function() { var event = new DeviceLightEvent(Math); assert_equals(event.type, '[object Math]'); }, 'type argument is host object'); test(function() { var event = new DeviceLightEvent(true); assert_equals(event.type, 'true'); }, 'type argument is boolean (true)'); test(function() { var event = new DeviceLightEvent(new Boolean(true)); assert_equals(event.type, 'true'); }, 'type argument is instance of Boolean (true)'); test(function() { var event = new DeviceLightEvent(false); assert_equals(event.type, 'false'); }, 'type argument is boolean (false)'); test(function() { var event = new DeviceLightEvent(new Boolean(false)); assert_equals(event.type, 'false'); }, 'type argument is instance of Boolean (false)'); test(function() { var event = new DeviceLightEvent('test'); assert_equals(event.type, 'test'); }, 'type argument is string'); test(function() { var event = new DeviceLightEvent(new String('test')); assert_equals(event.type, 'test'); }, 'type argument is instance of String'); test(function() { var event = new DeviceLightEvent(function test() {}); assert_regexp_match(event.type, /function test.+{\s?}/); }, 'type argument is function'); test(function() { var event = new DeviceLightEvent({ toString: function() { return '123'; } }); assert_equals(event.type, '123'); }, 'type argument is complext object, with toString method'); test(function() { assert_throws(null, function() { new DeviceLightEvent({ toString: function() { return function() {} } }); }); }, 'toString is of type function'); //test readonly attribute double value; test(function() { var event = new DeviceLightEvent('test'); assert_readonly(event, 'value', 'readonly attribute value'); }, 'value is readonly'); test(function() { var event = new DeviceLightEvent('test', { value: false }); assert_equals(event.value, 0, 'value set to false, converts to 0.'); }, 'value set to false'); test(function() { var event = new DeviceLightEvent('test', { value: true }); assert_equals(event.value, 1, 'value set to true, converts to 1.'); }, 'value set to true'); test(function() { var prop = { value: undefined }; try { var event = new DeviceLightEvent('test', prop); assert_true(isNaN(event.value)); } catch(e) { assert_unreached("error message: " + e.message); } }, 'value of undefined resolves to NaN'); test(function() { var event = new DeviceLightEvent('test', { value: null }); assert_equals(event.value, 0, 'value resolves to 0'); }, 'value of null resolves to 0'); test(function() { var event = new DeviceLightEvent('test', { value: '' }); assert_equals(event.value, 0, 'value must resolve to 0'); }, 'value of empty string must resolve to 0'); test(function() { var event = new DeviceLightEvent('test', { value: '\u0020' }); assert_equals(event.value, 0, 'value must resolve to 0'); }, 'value of U+0020 must resolve to 0'); test(function() { var event = new DeviceLightEvent('test', { value: '\u0020\u0020\u0020\u0020\u0020\u0020' }); assert_equals(event.value, 0, 'value must resolve to 0'); }, 'value of multiple U+0020 must resolve to 0'); test(function() { var event = new DeviceLightEvent('test', { value: '\u0020\u0020\u00201234\u0020\u0020\u0020' }); assert_equals(event.value, 1234, 'converts to 1234'); }, 'converts to 1234'); test(function() { var event = new DeviceLightEvent('test', { value: [] }); assert_equals(event.value, 0, 'converts to 0'); }, 'converts to 0'); test(function() { var prop = { value: {} }; try { var event = new DeviceLightEvent('test', prop); assert_true(isNaN(event.value)); } catch(e) { assert_unreached("error message: " + e.message); } }, 'value of {} resolves to NaN'); test(function() { var prop = { get value() { return NaN; } }; try { var event = new DeviceLightEvent('test', prop); assert_true(isNaN(event.value)); } catch(e) { assert_unreached("error message: " + e.message); } }, 'value resolves to NaN'); test(function() { var prop = { get value() { return '123'; } }; var event = new DeviceLightEvent('test', prop); assert_equals(event.value, 123, 'converts to 123'); }, 'value resolves 123'); test(function() { var desc = 'Expected to find ondevicelight attribute on window object'; assert_idl_attribute(window, 'ondevicelight', desc); }, 'ondevicelight event hander attr must be on window object.'); test(function() { var desc = 'window.ondevicelight must be null'; assert_equals(window.ondevicelight, null, desc); }, 'ondevicelight is null'); test(function() { var desc = 'window.ondevicelight did not accept callable object', func = function() {}, descidl = 'Expected to find ondevicelight attribute on window object'; assert_idl_attribute(window, 'ondevicelight', descidl); window.ondevicelight = func; assert_equals(window.ondevicelight, func, desc); }, 'expected ondevicelight on window and to be set to function'); test(function() { var desc = 'window.ondevicelight did not treat noncallable as null'; window.ondevicelight = function() {}; window.ondevicelight = {}; assert_equals(window.ondevicelight, null, desc); }, 'treat object as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable as null'; window.ondevicelight = function() {}; window.ondevicelight = { call: 'test' }; assert_equals(window.ondevicelight, null, desc); }, 'treat object with non-callable call property as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable (string) as null'; window.ondevicelight = function() {}; window.ondevicelight = 'string'; assert_equals(window.ondevicelight, null, desc); }, 'treat string as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable (number) as null'; window.ondevicelight = function() {}; window.ondevicelight = 123; assert_equals(window.ondevicelight, null, desc); }, 'treat number as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable (undefined) as null'; window.ondevicelight = function() {}; window.ondevicelight = undefined; assert_equals(window.ondevicelight, null, desc); }, 'treat undefined as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable (array) as null'; window.ondevicelight = function() {}; window.ondevicelight = []; assert_equals(window.ondevicelight, null, desc); }, 'treat array as null'); test(function() { var desc = 'window.ondevicelight did not treat noncallable host object as null'; window.ondevicelight = function() {}; window.ondevicelight = window.Node; assert_equals(window.ondevicelight, null, desc); }, 'treat non-callable host object as null'); //Async tests var t = async_test('test if DeviceLightEvent received'); window.addEventListener('devicelight', function(e) { t.step(function() { var msg = 'expected instance of DeviceLightEvent: '; assert_true(e instanceof window.DeviceLightEvent, msg); assert_idl_attribute(e, 'value', 'event has value property'); }); t.done(); }); var t2 = async_test('test if DeviceLightEvent recieved'); window.ondevicelight = function(e) { t2.step(function() { var msg = 'expected instance of DeviceLightEvent: '; assert_true(e instanceof window.DeviceLightEvent, msg); assert_idl_attribute(e, 'value', 'event has value property'); }); t2.done(); }; })();