This test ensures basic functionality of the underlying graphics library

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


Canvas.getContext
PASS context exists

Context is correct type
PASS context is correct type

Context contains getError
PASS context contains getError

Check default values
PASS context.getParameter(context.ACTIVE_TEXTURE) is context.TEXTURE0
PASS (context.getParameter(context.ALIASED_LINE_WIDTH_RANGE)[0] == 1) || (context.getParameter(context.ALIASED_LINE_WIDTH_RANGE)[1] == 1) is true
PASS (context.getParameter(context.ALIASED_POINT_SIZE_RANGE)[0] == 1) || (context.getParameter(context.ALIASED_POINT_SIZE_RANGE)[1] == 1) is true
PASS context.getParameter(context.ARRAY_BUFFER_BINDING) is null
PASS context.getParameter(context.BLEND) is false
PASS context.getParameter(context.BLEND_COLOR) is [0, 0, 0, 0]
PASS context.getParameter(context.BLEND_DST_ALPHA) is 0
PASS context.getParameter(context.BLEND_DST_RGB) is 0
PASS context.getParameter(context.BLEND_EQUATION_ALPHA) is context.FUNC_ADD
PASS context.getParameter(context.BLEND_EQUATION_RGB) is context.FUNC_ADD
PASS context.getParameter(context.BLEND_SRC_ALPHA) is 1
PASS context.getParameter(context.BLEND_SRC_RGB) is 1
PASS context.getParameter(context.COLOR_CLEAR_VALUE) is [0, 0, 0, 0]
PASS context.getParameter(context.COLOR_WRITEMASK) is [true, true, true, true]
PASS context.getParameter(context.CULL_FACE) is false
PASS context.getParameter(context.CULL_FACE_MODE) is context.BACK
PASS context.getParameter(context.CURRENT_PROGRAM) is null
PASS context.getParameter(context.DEPTH_CLEAR_VALUE) is 1
PASS context.getParameter(context.DEPTH_FUNC) is context.LESS
PASS context.getParameter(context.DEPTH_RANGE) is [0, 1]
PASS context.getParameter(context.DEPTH_TEST) is false
PASS context.getParameter(context.DEPTH_WRITEMASK) is true
PASS context.getParameter(context.DITHER) is true
PASS context.getParameter(context.ELEMENT_ARRAY_BUFFER_BINDING) is null
PASS context.getParameter(context.FRONT_FACE) is context.CCW
PASS context.getParameter(context.GENERATE_MIPMAP_HINT) is context.DONT_CARE
PASS context.getParameter(context.LINE_WIDTH) is 1
PASS context.getParameter(context.POLYGON_OFFSET_FACTOR) is 0
PASS context.getParameter(context.POLYGON_OFFSET_FILL) is false
PASS context.getParameter(context.POLYGON_OFFSET_UNITS) is 0
PASS context.getParameter(context.RENDERBUFFER_BINDING) is null
PASS context.getParameter(context.SAMPLE_COVERAGE_INVERT) is false
PASS context.getParameter(context.SAMPLE_COVERAGE_VALUE) is 1
PASS context.getParameter(context.SCISSOR_BOX)[0] is 0
PASS context.getParameter(context.SCISSOR_BOX)[1] is 0
PASS context.getParameter(context.SCISSOR_TEST) is false
PASS context.getParameter(context.STENCIL_BACK_FAIL) is context.KEEP
PASS context.getParameter(context.STENCIL_BACK_FUNC) is context.ALWAYS
PASS context.getParameter(context.STENCIL_BACK_PASS_DEPTH_FAIL) is context.KEEP
PASS context.getParameter(context.STENCIL_BACK_PASS_DEPTH_PASS) is context.KEEP
PASS context.getParameter(context.STENCIL_BACK_REF) is 0
PASS context.getParameter(context.STENCIL_BACK_VALUE_MASK) & minimumRequiredStencilMask is minimumRequiredStencilMask
PASS context.getParameter(context.STENCIL_BACK_WRITEMASK) & minimumRequiredStencilMask is minimumRequiredStencilMask
PASS context.getParameter(context.STENCIL_BITS) >= 0 is true
PASS context.getParameter(context.STENCIL_CLEAR_VALUE) is 0
PASS context.getParameter(context.STENCIL_FAIL) is context.KEEP
PASS context.getParameter(context.STENCIL_FUNC) is context.ALWAYS
PASS context.getParameter(context.STENCIL_PASS_DEPTH_FAIL) is context.KEEP
PASS context.getParameter(context.STENCIL_PASS_DEPTH_PASS) is context.KEEP
PASS context.getParameter(context.STENCIL_REF) is 0
PASS context.getParameter(context.STENCIL_TEST) is false
PASS context.getParameter(context.STENCIL_VALUE_MASK) & minimumRequiredStencilMask is minimumRequiredStencilMask
PASS context.getParameter(context.STENCIL_WRITEMASK) & minimumRequiredStencilMask is minimumRequiredStencilMask
PASS context.getParameter(context.TEXTURE_BINDING_2D) is null
PASS context.getParameter(context.TEXTURE_BINDING_CUBE_MAP) is null
PASS context.getParameter(context.UNPACK_ALIGNMENT) is 4
PASS context.getParameter(context.UNPACK_FLIP_Y_WEBGL) is false
PASS context.getParameter(context.UNPACK_PREMULTIPLY_ALPHA_WEBGL) is false
PASS context.getParameter(context.VIEWPORT) is [0, 0, 2, 2]
PASS context.getParameter(context.MAX_FRAGMENT_UNIFORM_VECTORS) >= 16 is true
PASS context.getParameter(context.MAX_VERTEX_UNIFORM_VECTORS) >= 128 is true
PASS context.getParameter(context.MAX_VARYING_VECTORS) >= 8 is true
PASS context.getParameter(context.COMPRESSED_TEXTURE_FORMATS) is []

PASS successfullyParsed is true

TEST COMPLETE

