<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>WebGL gl calls Conformance Tests</title>
<script src="../../../resources/js-test.js"></script>
<script src="resources/webgl-test.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<canvas id="canvas" width="2" height="2"> </canvas>

<script>

description("This test ensures basic functionality of the underlying graphics library");

debug("");
debug("Canvas.getContext");

var minimumRequiredStencilMask = 0;
var context = create3DContext(document.getElementById("canvas"));
if (!context)
    testFailed("context does not exist");
else {
    testPassed("context exists");

    debug("");
    debug("Context is correct type");
    if (context instanceof WebGLRenderingContext)
      testPassed("context is correct type");
    else
      testFailed("context is not correct type");

    debug("");
    debug("Context contains getError");
    if ("getError" in context)
      testPassed("context contains getError");
    else
      testFailed("context does not contains getError");

    debug("");
    debug("Check default values");
    shouldBe('context.getParameter(context.ACTIVE_TEXTURE)', 'context.TEXTURE0');
    shouldBe('(context.getParameter(context.ALIASED_LINE_WIDTH_RANGE)[0] == 1) || (context.getParameter(context.ALIASED_LINE_WIDTH_RANGE)[1] == 1)', 'true');
    shouldBe('(context.getParameter(context.ALIASED_POINT_SIZE_RANGE)[0] == 1) || (context.getParameter(context.ALIASED_POINT_SIZE_RANGE)[1] == 1)', 'true');
    shouldBe('context.getParameter(context.ARRAY_BUFFER_BINDING)', 'null');
    shouldBe('context.getParameter(context.BLEND)', 'false');
    shouldBe('context.getParameter(context.BLEND_COLOR)', '[0, 0, 0, 0]');
    shouldBe('context.getParameter(context.BLEND_DST_ALPHA)', '0');
    shouldBe('context.getParameter(context.BLEND_DST_RGB)', '0');
    shouldBe('context.getParameter(context.BLEND_EQUATION_ALPHA)', 'context.FUNC_ADD');
    shouldBe('context.getParameter(context.BLEND_EQUATION_RGB)', 'context.FUNC_ADD');
    shouldBe('context.getParameter(context.BLEND_SRC_ALPHA)', '1');
    shouldBe('context.getParameter(context.BLEND_SRC_RGB)', '1');
    shouldBe('context.getParameter(context.COLOR_CLEAR_VALUE)', '[0, 0, 0, 0]');
    shouldBe('context.getParameter(context.COLOR_WRITEMASK)', '[true, true, true, true]');
    shouldBe('context.getParameter(context.CULL_FACE)', 'false');
    shouldBe('context.getParameter(context.CULL_FACE_MODE)', 'context.BACK');
    shouldBe('context.getParameter(context.CURRENT_PROGRAM)', 'null');
    shouldBe('context.getParameter(context.DEPTH_CLEAR_VALUE)', '1');
    shouldBe('context.getParameter(context.DEPTH_FUNC)', 'context.LESS');
    shouldBe('context.getParameter(context.DEPTH_RANGE)', '[0, 1]');
    shouldBe('context.getParameter(context.DEPTH_TEST)', 'false');
    shouldBe('context.getParameter(context.DEPTH_WRITEMASK)', 'true');
    shouldBe('context.getParameter(context.DITHER)', 'true');
    shouldBe('context.getParameter(context.ELEMENT_ARRAY_BUFFER_BINDING)', 'null');
    shouldBe('context.getParameter(context.FRONT_FACE)', 'context.CCW');
    shouldBe('context.getParameter(context.GENERATE_MIPMAP_HINT)', 'context.DONT_CARE');
    shouldBe('context.getParameter(context.LINE_WIDTH)', '1');
    shouldBe('context.getParameter(context.POLYGON_OFFSET_FACTOR)', '0');
    shouldBe('context.getParameter(context.POLYGON_OFFSET_FILL)', 'false');
    shouldBe('context.getParameter(context.POLYGON_OFFSET_UNITS)', '0');
    shouldBe('context.getParameter(context.RENDERBUFFER_BINDING)', 'null');
    shouldBe('context.getParameter(context.SAMPLE_COVERAGE_INVERT)', 'false');
    shouldBe('context.getParameter(context.SAMPLE_COVERAGE_VALUE)', '1');
    shouldBe('context.getParameter(context.SCISSOR_BOX)[0]', '0');
    shouldBe('context.getParameter(context.SCISSOR_BOX)[1]', '0');
    shouldBe('context.getParameter(context.SCISSOR_TEST)', 'false');
    shouldBe('context.getParameter(context.STENCIL_BACK_FAIL)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_BACK_FUNC)', 'context.ALWAYS');
    shouldBe('context.getParameter(context.STENCIL_BACK_PASS_DEPTH_FAIL)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_BACK_PASS_DEPTH_PASS)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_BACK_REF)', '0');

    var stencilBits = context.getParameter(context.STENCIL_BITS);
    minimumRequiredStencilMask = (1 << stencilBits) - 1;

    shouldBe('context.getParameter(context.STENCIL_BACK_VALUE_MASK) & minimumRequiredStencilMask', 'minimumRequiredStencilMask');
    shouldBe('context.getParameter(context.STENCIL_BACK_WRITEMASK) & minimumRequiredStencilMask', 'minimumRequiredStencilMask');

    // If EXT_packed_depth_stencil is supported, STENCIL_BITS > 0; otherwise, STENCIL_BITS == 0.
    shouldBe('context.getParameter(context.STENCIL_BITS) >= 0', 'true');
    shouldBe('context.getParameter(context.STENCIL_CLEAR_VALUE)', '0');
    shouldBe('context.getParameter(context.STENCIL_FAIL)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_FUNC)', 'context.ALWAYS');
    shouldBe('context.getParameter(context.STENCIL_PASS_DEPTH_FAIL)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_PASS_DEPTH_PASS)', 'context.KEEP');
    shouldBe('context.getParameter(context.STENCIL_REF)', '0');
    shouldBe('context.getParameter(context.STENCIL_TEST)', 'false');

    shouldBe('context.getParameter(context.STENCIL_VALUE_MASK) & minimumRequiredStencilMask', 'minimumRequiredStencilMask');
    shouldBe('context.getParameter(context.STENCIL_WRITEMASK) & minimumRequiredStencilMask', 'minimumRequiredStencilMask');

    shouldBe('context.getParameter(context.TEXTURE_BINDING_2D)', 'null');
    shouldBe('context.getParameter(context.TEXTURE_BINDING_CUBE_MAP)', 'null');
    shouldBe('context.getParameter(context.UNPACK_ALIGNMENT)', '4');
    shouldBe('context.getParameter(context.UNPACK_FLIP_Y_WEBGL)', 'false');
    shouldBe('context.getParameter(context.UNPACK_PREMULTIPLY_ALPHA_WEBGL)', 'false');
    shouldBe('context.getParameter(context.VIEWPORT)', '[0, 0, 2, 2]');
    shouldBeTrue('context.getParameter(context.MAX_FRAGMENT_UNIFORM_VECTORS) >= 16');
    shouldBeTrue('context.getParameter(context.MAX_VERTEX_UNIFORM_VECTORS) >= 128');
    shouldBeTrue('context.getParameter(context.MAX_VARYING_VECTORS) >= 8');
    shouldBe('context.getParameter(context.COMPRESSED_TEXTURE_FORMATS)', '[]');
}

debug("");

</script>
</body>
</html>
