<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
    </head>
    <body>
        <script>
        description("Tests the acceptable types for arguments to navigator.getUserMedia methods.");
        
        function test(expression, expressionShouldThrow, expectedException) {
            if (expressionShouldThrow) {
                if (expectedException)
                    shouldThrow(expression, '"' + expectedException + '"');
                else
                    shouldThrow(expression, '"TypeError: Not enough arguments"');
            } else {
                shouldNotThrow(expression);
            }
        }
        
        var errorCallbackError = new TypeError("Argument 3 ('errorCallback') to Navigator.getUserMedia must be a function")
        var invalidDictionaryError = new TypeError('First argument of getUserMedia must be a valid Dictionary')
        var notSupportedError = new Error('NotSupportedError: DOM Exception 9');
        var successCallbackError = new TypeError("Argument 2 ('successCallback') to Navigator.getUserMedia must be a function")
        var typeError = new TypeError('Type error');
        var typeNotAnObjectError = new TypeError('Not an object.');
        
        var emptyFunction = function() {};
        
        // No arguments
        test('navigator.getUserMedia()', true);
        
        // 1 Argument (Navigtor.getUserMedia requires at least 3 arguments).
        test('navigator.getUserMedia(undefined)', true);
        test('navigator.getUserMedia(null)', true);
        test('navigator.getUserMedia({ })', true);
        test('navigator.getUserMedia({video: true})', true);
        test('navigator.getUserMedia(true)', true);
        test('navigator.getUserMedia(42)', true);
        test('navigator.getUserMedia(Infinity)', true);
        test('navigator.getUserMedia(-Infinity)', true);
        test('navigator.getUserMedia(emptyFunction)', true);
        
        // 2 Arguments.
        test('navigator.getUserMedia({video: true}, emptyFunction)', true);
        test('navigator.getUserMedia(undefined, emptyFunction)', true);
        test('navigator.getUserMedia(null, emptyFunction)', true);
        test('navigator.getUserMedia({ }, emptyFunction)', true);
        test('navigator.getUserMedia(true, emptyFunction)', true);
        test('navigator.getUserMedia(42, emptyFunction)', true);
        test('navigator.getUserMedia(Infinity, emptyFunction)', true);
        test('navigator.getUserMedia(-Infinity, emptyFunction)', true);
        test('navigator.getUserMedia(emptyFunction, emptyFunction)', true);
        test('navigator.getUserMedia({video: true}, "foobar")', true);
        test('navigator.getUserMedia({video: true}, undefined)', true);
        test('navigator.getUserMedia({video: true}, null)', true);
        test('navigator.getUserMedia({video: true}, {})', true);
        test('navigator.getUserMedia({video: true}, true)', true);
        test('navigator.getUserMedia({video: true}, 42)', true);
        test('navigator.getUserMedia({video: true}, Infinity)', true);
        test('navigator.getUserMedia({video: true}, -Infinity)', true);
        
        // 3 Arguments.
        test('navigator.getUserMedia({ }, emptyFunction, emptyFunction)', false);
        test('navigator.getUserMedia({video: true}, emptyFunction, emptyFunction)', false);
        test('navigator.getUserMedia({video: true}, emptyFunction, undefined)', true, errorCallbackError);
        test('navigator.getUserMedia({audio:true, video:true}, emptyFunction, undefined)', true, errorCallbackError);
        test('navigator.getUserMedia({audio:true}, emptyFunction, undefined)', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, "video")', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, null)', true, errorCallbackError );
        test('navigator.getUserMedia({video: true}, emptyFunction, {})', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, true)', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, 42)', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, Infinity)', true, errorCallbackError);
        test('navigator.getUserMedia({video: true}, emptyFunction, -Infinity)', true, errorCallbackError);
        
        window.jsTestIsAsync = false;
        </script>
        <script src="../../resources/js-test-post.js"></script>
    </body>
</html>
