This test ensures various WebGL functions fail when passed non OpenGL ES 2.0 enums.

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


Canvas.getContext
PASS context exists

Checking gl enums.
PASS getError was expected value: NO_ERROR :
PASS getError was expected value: INVALID_ENUM : gl.bindTexture(desktopGL['TEXTURE_3D'], tex) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquation(desktopGL['MIN']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquation(desktopGL['MAX']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquationSeparate(desktopGL['MIN'], gl.FUNC_ADD) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquationSeparate(desktopGL['MAX'], gl.FUNC_ADD) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquationSeparate(gl.FUNC_ADD, desktopGL['MIN']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.blendEquationSeparate(gl.FUNC_ADD, desktopGL['MAX']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.bufferData(gl.ARRAY_BUFFER, 3, desktopGL['STATIC_READ']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.disable(desktopGL['CLIP_PLANE0']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.disable(desktopGL['POINT_SPRITE']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.getBufferParameter(gl.ARRAY_BUFFER, desktopGL['PIXEL_PACK_BUFFER']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.hint(desktopGL['PERSPECTIVE_CORRECTION_HINT'], gl.FASTEST) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.isEnabled(desktopGL['CLIP_PLANE0']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.isEnabled(desktopGL['POINT_SPRITE']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.pixelStorei(desktopGL['PACK_SWAP_BYTES'], 1) should return INVALID_ENUM.
PASS getError was one of: INVALID_ENUM or INVALID_OPERATION : gl.readPixels(0, 0, 1, 1, gl.ALPHA, gl.SHORT, buf) should return INVALID_ENUM or INVALID_OPERATION.
PASS getError was expected value: NO_ERROR :
PASS getError was expected value: INVALID_ENUM : gl.getTexParameter(gl.TEXTURE_2D, desktopGL['GENERATE_MIPMAP']) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.texParameteri(desktopGL['TEXTURE_3D'], gl.TEXTURE_MAG_FILTER, gl.NEAREST) should return INVALID_ENUM.
PASS getError was expected value: INVALID_ENUM : gl.texParameteri(gl.TEXTURE_2D, desktopGL['GENERATE_MIPMAP'], 1) should return INVALID_ENUM.

PASS successfullyParsed is true

TEST COMPLETE

