summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeStateApiTests.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeStateApiTests.js927
1 files changed, 927 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeStateApiTests.js b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeStateApiTests.js
new file mode 100644
index 0000000000..40d6384edc
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/deqp/functional/gles3/es3fNegativeStateApiTests.js
@@ -0,0 +1,927 @@
+/*-------------------------------------------------------------------------
+ * drawElements Quality Program OpenGL ES 3.0 Module
+ * -------------------------------------------------
+ *
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Negative GL State API tests.
+ *//*--------------------------------------------------------------------*/
+'use strict';
+goog.provide('functional.gles3.es3fNegativeStateApiTests');
+
+goog.require('framework.common.tcuTestCase');
+goog.require('functional.gles3.es3fApiCase');
+goog.require('framework.opengl.gluShaderProgram');
+
+goog.scope(function() {
+
+ var es3fNegativeStateApiTests = functional.gles3.es3fNegativeStateApiTests;
+ var es3fApiCase = functional.gles3.es3fApiCase;
+ var tcuTestCase = framework.common.tcuTestCase;
+ var gluShaderProgram = framework.opengl.gluShaderProgram;
+
+ /**
+ * @type {string}
+ * @const
+ */
+ var uniformTestVertSource = '#version 300 es\n' +
+ 'uniform mediump vec4 vUnif_vec4;\n' +
+ 'in mediump vec4 attr;\n' +
+ 'layout(std140) uniform Block { mediump vec4 blockVar; };\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' gl_Position = vUnif_vec4 + blockVar + attr;\n' +
+ '}\n';
+
+ /**
+ * @type {string}
+ * @const
+ */
+ var uniformTestFragSource = '#version 300 es\n' +
+ 'uniform mediump ivec4 fUnif_ivec4;\n' +
+ 'uniform mediump uvec4 fUnif_uvec4;\n' +
+ 'layout(location = 0) out mediump vec4 fragColor;\n' +
+ 'void main (void)\n' +
+ '{\n' +
+ ' fragColor = vec4(vec4(fUnif_ivec4) + vec4(fUnif_uvec4));\n' +
+ '}\n';
+
+ /**
+ * @param {WebGL2RenderingContext} gl
+ */
+ es3fNegativeStateApiTests.init = function(gl) {
+
+ var testGroup = tcuTestCase.runner.testCases;
+
+ // Enabling & disabling states
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('enable', 'Invalid gl.enable() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if cap is not one of the allowed values.');
+ gl.enable(-1);
+ this.expectError(gl.INVALID_ENUM);
+
+ }));
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('disable', 'Invalid gl.disable() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if cap is not one of the allowed values.');
+ gl.disable(-1);
+ this.expectError(gl.INVALID_ENUM);
+
+ }));
+
+ // Simple state queries
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_parameter', 'Invalid gl.getParameter() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not one of the allowed values.');
+ /** @type{boolean} */ var params = false;
+ //glGetBooleanv(-1, params);
+ params = /** @type{boolean} */ (gl.getParameter(-1));
+ this.expectError(gl.INVALID_ENUM);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_indexed_parameter', 'Invalid gl.getIndexedParameter() usage', gl, function() {
+ /** @type{number} */ var data = -1;
+ /** @type{number} */ var maxUniformBufferBindings;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if name is not an accepted value.');
+ data = /** @type{number} */ (gl.getIndexedParameter(-1, 0));
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is outside of the valid range for the indexed state target.');
+ maxUniformBufferBindings = /** @type{number} */ (gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS));
+ this.expectError(gl.NO_ERROR);
+ data = /** @type{number} */ (gl.getIndexedParameter(gl.UNIFORM_BUFFER_BINDING, maxUniformBufferBindings));
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ // Enumerated state queries: Shaders
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_attached_shaders', 'Invalid gl.getAttachedShaders() usage', gl, function() {
+ /** @type{WebGLShader} */ var shaderObject = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getAttachedShaders(null);
+ });
+
+ gl.deleteShader(shaderObject);
+ gl.deleteProgram(program);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_shader_parameter', 'Invalid gl.getShaderParameter() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+ /** @type{number} */ var param = -1;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted value.');
+ param = /** @type{number} */ (gl.getShaderParameter(shader, -1));
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('An exception is thrown if shader is null.');
+ this.expectThrowNoError(function() {
+ gl.getShaderParameter(null, gl.SHADER_TYPE);
+ });
+
+ gl.deleteShader(shader);
+ gl.deleteProgram(program);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_shader_info_log', 'Invalid gl.getShaderInfoLog() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+
+ bufferedLogToConsole('An exception is thrown if shader is null.');
+ this.expectThrowNoError(function() {
+ gl.getShaderInfoLog(null);
+ });
+
+ gl.deleteShader(shader);
+ gl.deleteProgram(program);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_shader_precision_format', 'Invalid gl.getShaderPrecisionFormat() usage', gl, function() {
+ /** @type{WebGLShaderPrecisionFormat } */ var precision;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if shaderType or precisionType is not an accepted value.');
+ precision = gl.getShaderPrecisionFormat (-1, gl.MEDIUM_FLOAT);
+ this.expectError(gl.INVALID_ENUM);
+ precision = gl.getShaderPrecisionFormat (gl.VERTEX_SHADER, -1);
+ this.expectError(gl.INVALID_ENUM);
+ precision = gl.getShaderPrecisionFormat (-1, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_shader_source', 'Invalid gl.getShaderSource() usage', gl, function() {
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+
+ bufferedLogToConsole('An exception is thrown if shader is null.');
+ this.expectThrowNoError(function() {
+ gl.getShaderSource(null);
+ });
+
+ gl.deleteProgram(program);
+ gl.deleteShader(shader);
+ }));
+
+ // Enumerated state queries: Programs
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_program_parameter', 'Invalid gl.getProgramParameter() usage', gl, function() {
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{boolean} */ var params;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted value.');
+ params = /** @type{boolean} */ (gl.getProgramParameter(program, -1));
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getProgramParameter(null, gl.LINK_STATUS);
+ });
+
+ gl.deleteProgram(program);
+ gl.deleteShader(shader);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_program_info_log', 'Invalid gl.getProgramInfoLog() usage', gl, function() {
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getProgramInfoLog (null);
+ });
+
+ gl.deleteProgram(program);
+ gl.deleteShader(shader);
+ }));
+
+ // Enumerated state queries: Shader variables
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_tex_parameter', 'Invalid gl.getTexParameter() usage', gl, function() {
+ /** @type{WebGLTexture} */ var texture = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, texture);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target or pname is not an accepted value.');
+ gl.getTexParameter (-1, gl.TEXTURE_MAG_FILTER);
+ this.expectError(gl.INVALID_ENUM);
+ gl.getTexParameter (gl.TEXTURE_2D, -1);
+ this.expectError(gl.INVALID_ENUM);
+ gl.getTexParameter (-1, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ gl.deleteTexture(texture);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_uniform', 'Invalid gl.getUniform() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ gl.useProgram(program.getProgram());
+
+ /** @type{WebGLUniformLocation} */ var unif = gl.getUniformLocation(program.getProgram(), 'vUnif_vec4'); // vec4
+ assertMsgOptions(unif != null, 'Failed to retrieve uniform location', false, true);
+
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{WebGLProgram} */ var programEmpty = gl.createProgram();
+ /** @type{*} */ var params;
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getUniform (null, unif);
+ });
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if program has not been successfully linked.');
+ params = gl.getUniform (programEmpty, unif);
+ this.expectError(gl.INVALID_OPERATION);
+
+ bufferedLogToConsole('An exception is thrown if location is null.');
+ this.expectThrowNoError(function() {
+ gl.getUniform (program.getProgram(), null);
+ });
+
+ gl.deleteShader(shader);
+ gl.deleteProgram(programEmpty);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_active_uniform', 'Invalid gl.getActiveUniform() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ /** @type{number} */ var numActiveUniforms = -1;
+
+ numActiveUniforms = /** @type{number} */ (gl.getProgramParameter(program.getProgram(), gl.ACTIVE_UNIFORMS));
+ bufferedLogToConsole('// gl.ACTIVE_UNIFORMS = ' + numActiveUniforms + ' (expected 4).');
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getActiveUniform(null, 0);
+ });
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to the number of active uniform variables in program.');
+ gl.useProgram(program.getProgram());
+ gl.getActiveUniform(program.getProgram(), numActiveUniforms);
+ this.expectError(gl.INVALID_VALUE);
+
+ gl.useProgram(null);
+ gl.deleteShader(shader);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_active_uniforms', 'Invalid gl.getActiveUniforms() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ /** @type{Array<number>} */ var dummyUniformIndex = [1];
+ /** @type{Array<number>} */ var dummyParamDst;
+ /** @type{number} */ var numActiveUniforms = -1;
+
+ gl.useProgram(program.getProgram());
+
+ numActiveUniforms = /** @type{number} */ (gl.getProgramParameter(program.getProgram(), gl.ACTIVE_UNIFORMS));
+ bufferedLogToConsole('// gl.ACTIVE_UNIFORMS = ' + numActiveUniforms + ' (expected 4).');
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getActiveUniforms(null, dummyUniformIndex, gl.UNIFORM_TYPE);
+ });
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if any value in uniformIndices is greater than or equal to the value of gl.ACTIVE_UNIFORMS for program.');
+ /** @type{Array<number>} */ var invalidUniformIndices;
+ /** @type{Array<number>} */ var dummyParamsDst;
+ for (var excess = 0; excess <= 2; excess++) {
+ invalidUniformIndices = [1, numActiveUniforms - 1 + excess, 1];
+ dummyParamsDst = gl.getActiveUniforms(program.getProgram(), invalidUniformIndices, gl.UNIFORM_TYPE);
+ this.expectError(excess == 0 ? gl.NO_ERROR : gl.INVALID_VALUE);
+ }
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted token.');
+ dummyParamDst = gl.getActiveUniforms(program.getProgram(), dummyUniformIndex, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ gl.useProgram(null);
+ gl.deleteShader(shader);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_active_uniform_block_parameter', 'Invalid gl.getActiveUniformBlockParameter() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ /** @type{*} */ var params;
+ /** @type{number} */ var numActiveBlocks = -1;
+
+ numActiveBlocks = /** @type{number} */ (gl.getProgramParameter(program.getProgram(), gl.ACTIVE_UNIFORM_BLOCKS));
+ bufferedLogToConsole('// gl.ACTIVE_UNIFORM_BLOCKS = ' + numActiveBlocks + ' (expected 1).');
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of gl.ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.');
+ gl.useProgram(program.getProgram());
+ this.expectError(gl.NO_ERROR);
+ params = gl.getActiveUniformBlockParameter(program.getProgram(), numActiveBlocks, gl.UNIFORM_BLOCK_BINDING);
+ this.expectError(gl.INVALID_VALUE);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not one of the accepted tokens.');
+ params = gl.getActiveUniformBlockParameter(program.getProgram(), 0, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_active_uniform_block_name', 'Invalid gl.getActiveUniformBlockName() usage', gl, function() {
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ /** @type{number} */ var length = -1;
+ /** @type{number} */ var numActiveBlocks = -1;
+ /** @type{string} */ var uniformBlockName;
+
+ numActiveBlocks = /** @type{number} */ (gl.getProgramParameter(program.getProgram(), gl.ACTIVE_UNIFORM_BLOCKS));
+ bufferedLogToConsole('// gl.ACTIVE_UNIFORM_BLOCKS = ' + numActiveBlocks + ' (expected 1).');
+ this.expectError(gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if uniformBlockIndex is greater than or equal to the value of gl.ACTIVE_UNIFORM_BLOCKS or is not the index of an active uniform block in program.');
+ gl.useProgram(program.getProgram());
+ this.expectError(gl.NO_ERROR);
+ uniformBlockName = gl.getActiveUniformBlockName(program.getProgram(), numActiveBlocks);
+ this.expectError(gl.INVALID_VALUE);
+
+ gl.useProgram(null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_active_attrib', 'Invalid gl.getActiveAttrib() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ /** @type{number} */ var numActiveAttributes = -1;
+
+ /** @type{WebGLActiveInfo} */ var activeInfo;
+ /** @type{number} */ var size = -1;
+ /** @type{number} */ var type = -1;
+ /** @type{string} */ var name;
+
+ numActiveAttributes = /** @type{number} */(gl.getProgramParameter(program.getProgram(), gl.ACTIVE_ATTRIBUTES));
+ bufferedLogToConsole('// gl.ACTIVE_ATTRIBUTES = ' + numActiveAttributes + ' (expected 1).');
+
+ gl.useProgram(program.getProgram());
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getActiveAttrib(null, 0);
+ });
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.ACTIVE_ATTRIBUTES.');
+ activeInfo = gl.getActiveAttrib(program.getProgram(), numActiveAttributes);
+ this.expectError(gl.INVALID_VALUE);
+
+ gl.useProgram(null);
+ gl.deleteShader(shader);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_uniform_indices', 'Invalid gl.getUniformIndices() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{gluShaderProgram.ShaderProgram} */ var program = new gluShaderProgram.ShaderProgram(gl,gluShaderProgram.makeVtxFragSources(uniformTestVertSource, uniformTestFragSource));
+ gl.useProgram(program.getProgram());
+ /** @type{number} */ var numActiveBlocks = -1;
+ /** @type{Array<string>} */ var uniformName = ['Block.blockVar'];
+ /** @type{Array<number>} */ var uniformIndices = [-1];
+
+ numActiveBlocks = /** @type{number} */(gl.getProgramParameter(program.getProgram(), gl.ACTIVE_UNIFORM_BLOCKS));
+ bufferedLogToConsole('// gl.ACTIVE_UNIFORM_BLOCKS = ' + numActiveBlocks);
+ this.expectError (gl.NO_ERROR);
+
+ bufferedLogToConsole('An exception is thrown if program is null.');
+ this.expectThrowNoError(function() {
+ gl.getUniformIndices(null, uniformName);
+ });
+
+ gl.useProgram(null);
+ gl.deleteShader(shader);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_vertex_attrib', 'Invalid gl.getVertexAttrib() usage', gl, function() {
+ /** @type{*} */ var params;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted value.');
+ params = gl.getVertexAttrib(0, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ /** @type{number} */ var maxVertexAttribs;
+ maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ params = gl.getVertexAttrib(maxVertexAttribs, gl.VERTEX_ATTRIB_ARRAY_ENABLED);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_vertex_attrib_offset', 'Invalid gl.getVertexAttribOffset() usage', gl, function() {
+ /** @type{number} */ var ptr;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted value.');
+ ptr = gl.getVertexAttribOffset(0, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_VALUE is generated if index is greater than or equal to gl.MAX_VERTEX_ATTRIBS.');
+ /** @type{number} */ var maxVertexAttribs;
+ maxVertexAttribs = /** @type{number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
+ ptr = gl.getVertexAttribOffset(maxVertexAttribs, gl.VERTEX_ATTRIB_ARRAY_POINTER);
+ this.expectError(gl.INVALID_VALUE);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_frag_data_location', 'Invalid gl.getFragDataLocation() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader = gl.createShader(gl.VERTEX_SHADER);
+ /** @type{WebGLProgram} */ var program = gl.createProgram();
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if program has not been linked.');
+ gl.getFragDataLocation(program, 'gl_FragColor');
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteProgram(program);
+ gl.deleteShader(shader);
+ }));
+
+ // Enumerated state queries: Buffers
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_buffer_parameter', 'Invalid gl.getBufferParameter() usage', gl, function() {
+ /** @type{number} */ var params = -1;
+ /** @type{WebGLBuffer} */ var buf;
+ buf = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target or value is not an accepted value.');
+ params = /** @type{number} */ (gl.getBufferParameter(-1, gl.BUFFER_SIZE));
+ this.expectError(gl.INVALID_ENUM);
+ params = /** @type{number} */ (gl.getBufferParameter(gl.ARRAY_BUFFER, -1));
+ this.expectError(gl.INVALID_ENUM);
+ params = /** @type{number} */ (gl.getBufferParameter(-1, -1));
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.');
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ params = /** @type{number} */ (gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE));
+ this.expectError(gl.INVALID_OPERATION);
+
+ gl.deleteBuffer(buf);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_framebuffer_attachment_parameter', 'Invalid gl.getFramebufferAttachmentParameter() usage', gl, function() {
+ /** @type{*} */ var params;
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{Array<WebGLRenderbuffer>} */ var rbo = [];
+
+ fbo = gl.createFramebuffer();
+ rbo[0] = gl.createRenderbuffer();
+ rbo[1] = gl.createRenderbuffer();
+
+ gl.bindFramebuffer (gl.FRAMEBUFFER, fbo);
+ gl.bindRenderbuffer (gl.RENDERBUFFER, rbo[0]);
+ gl.renderbufferStorage (gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 16, 16);
+ gl.framebufferRenderbuffer (gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rbo[0]);
+ gl.bindRenderbuffer (gl.RENDERBUFFER, rbo[1]);
+ gl.renderbufferStorage (gl.RENDERBUFFER, gl.STENCIL_INDEX8, 16, 16);
+ gl.framebufferRenderbuffer (gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo[1]);
+ gl.checkFramebufferStatus (gl.FRAMEBUFFER);
+ this.expectError (gl.NO_ERROR);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
+ gl.getFramebufferAttachmentParameter(-1, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); // TYPE is gl.RENDERBUFFER
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not valid for the value of gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE.');
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL); // TYPE is gl.RENDERBUFFER
+ this.expectError(gl.INVALID_ENUM);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.BACK, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); // TYPE is gl.FRAMEBUFFER_DEFAULT
+ this.expectError(gl.INVALID_ENUM);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if attachment is gl.DEPTH_STENCIL_ATTACHMENT and different objects are bound to the depth and stencil attachment points of target.');
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME);
+ this.expectError(gl.INVALID_OPERATION);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if the value of gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is gl.NONE and pname is not gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME.');
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); // TYPE is gl.NONE
+ this.expectError(gl.NO_ERROR);
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE); // TYPE is gl.NONE
+ this.expectError(gl.INVALID_OPERATION);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION or gl.INVALID_ENUM is generated if attachment is not one of the accepted values for the current binding of target.');
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.BACK, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); // A FBO is bound so gl.BACK is invalid
+ this.expectError([gl.INVALID_OPERATION, gl.INVALID_ENUM]);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
+ gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); // Default framebuffer is bound so gl.COLOR_ATTACHMENT0 is invalid
+ this.expectError([gl.INVALID_OPERATION, gl.INVALID_ENUM]);
+
+ gl.deleteFramebuffer(fbo);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_renderbuffer_parameter', 'Invalid gl.getRenderbufferParameter() usage', gl, function() {
+ /** @type{number} */ var params = -1;
+ /** @type{WebGLRenderbuffer} */ var rbo;
+ rbo = gl.createRenderbuffer();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.RENDERBUFFER.');
+ gl.getRenderbufferParameter(-1, gl.RENDERBUFFER_WIDTH);
+ this.expectError(gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not one of the accepted tokens.');
+ gl.getRenderbufferParameter(gl.RENDERBUFFER, -1);
+ this.expectError(gl.INVALID_ENUM);
+
+ gl.deleteRenderbuffer(rbo);
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_internalformat_parameter', 'Invalid gl.getInternalformatParameter() usage', gl, function() {
+ /** @type{WebGLRenderbuffer} */ var rbo = gl.createRenderbuffer();
+ /** @type{WebGLFramebuffer} */ var fbo = gl.createFramebuffer();
+ /** @type{WebGLTexture} */ var tex = gl.createTexture();
+ gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not gl.SAMPLES or gl.NUM_SAMPLE_COUNTS.');
+ gl.getInternalformatParameter (gl.RENDERBUFFER, gl.RGBA8, -1);
+ this.expectError (gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if internalformat is not color-, depth-, or stencil-renderable.');
+ gl.getInternalformatParameter (gl.RENDERBUFFER, gl.RG8_SNORM, gl.NUM_SAMPLE_COUNTS);
+ this.expectError (gl.INVALID_ENUM);
+ gl.getInternalformatParameter (gl.RENDERBUFFER, gl.COMPRESSED_RGB8_ETC2, gl.NUM_SAMPLE_COUNTS);
+ this.expectError (gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.RENDERBUFFER.');
+ gl.getInternalformatParameter (-1, gl.RGBA8, gl.NUM_SAMPLE_COUNTS);
+ this.expectError (gl.INVALID_ENUM);
+ gl.getInternalformatParameter (gl.FRAMEBUFFER, gl.RGBA8, gl.NUM_SAMPLE_COUNTS);
+ this.expectError (gl.INVALID_ENUM);
+ gl.getInternalformatParameter (gl.TEXTURE_2D, gl.RGBA8, gl.NUM_SAMPLE_COUNTS);
+ this.expectError (gl.INVALID_ENUM);
+
+ gl.deleteRenderbuffer(rbo);
+ gl.deleteFramebuffer(fbo);
+ gl.deleteTexture(tex);
+
+ }));
+
+ // Query object queries
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_query', 'Invalid gl.getQuery() usage', gl, function() {
+ /** @type{number} */ var params = -1;
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if target or pname is not an accepted value.');
+ gl.getQuery (gl.ANY_SAMPLES_PASSED, -1);
+ this.expectError (gl.INVALID_ENUM);
+ gl.getQuery (-1, gl.CURRENT_QUERY);
+ this.expectError (gl.INVALID_ENUM);
+ gl.getQuery (-1, -1);
+ this.expectError (gl.INVALID_ENUM);
+
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_query_parameter', 'Invalid gl.getQueryParameter() usage', gl, function() {
+
+ /** @type{WebGLQuery} */ var id;
+ id = gl.createQuery();
+
+ bufferedLogToConsole('An exception is thrown if the query object is null.');
+ this.expectThrowNoError(function() {
+ gl.getQueryParameter (null, gl.QUERY_RESULT_AVAILABLE);
+ });
+
+ bufferedLogToConsole('// Note: ' + id + ' is not a query object yet, since it hasn\'t been used by gl.beginQuery');
+ gl.getQueryParameter (id, gl.QUERY_RESULT_AVAILABLE);
+ this.expectError (gl.INVALID_OPERATION);
+
+ gl.beginQuery (gl.ANY_SAMPLES_PASSED, id);
+ gl.endQuery (gl.ANY_SAMPLES_PASSED);
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not an accepted value.');
+ gl.getQueryParameter (id, -1);
+ this.expectError (gl.INVALID_ENUM);
+
+ bufferedLogToConsole('gl.INVALID_OPERATION is generated if id is the name of a currently active query object.');
+ gl.beginQuery (gl.ANY_SAMPLES_PASSED, id);
+ this.expectError (gl.NO_ERROR);
+ gl.getQueryParameter (id, gl.QUERY_RESULT_AVAILABLE);
+ this.expectError (gl.INVALID_OPERATION);
+ gl.endQuery (gl.ANY_SAMPLES_PASSED);
+ this.expectError (gl.NO_ERROR);
+
+ gl.deleteQuery(id);
+ }));
+
+ // Sync object queries
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('get_sync_parameter', 'Invalid gl.getSyncParameter() usage', gl, function() {
+ /** @type{WebGLSync} */ var sync;
+
+ bufferedLogToConsole('An exception is thrown if sync is null.');
+ this.expectThrowNoError(function() {
+ gl.getSyncParameter (null, gl.OBJECT_TYPE);
+ });
+
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if pname is not one of the accepted tokens.');
+ sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
+ this.expectError (gl.NO_ERROR);
+ gl.getSyncParameter (sync, -1);
+ this.expectError (gl.INVALID_ENUM);
+
+ }));
+
+ // Enumerated boolean state queries
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_enabled', 'Invalid gl.isEnabled() usage', gl, function() {
+ bufferedLogToConsole('gl.INVALID_ENUM is generated if cap is not an accepted value.');
+ gl.isEnabled(-1);
+ this.expectError(gl.INVALID_ENUM);
+ gl.isEnabled(gl.TRIANGLES);
+ this.expectError(gl.INVALID_ENUM);
+
+ }));
+
+ // Named Object Usage
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_buffer', 'Invalid gl.isBuffer() usage', gl, function() {
+ /** @type{WebGLBuffer} */ var buffer;
+ /** @type{boolean} */ var isBuffer;
+
+ bufferedLogToConsole('A name returned by glGenBuffers, but not yet associated with a buffer object by calling glBindBuffer, is not the name of a buffer object.');
+ isBuffer = gl.isBuffer(buffer);
+ assertMsgOptions(!isBuffer, 'Got invalid boolean value', false, true);
+
+ buffer = gl.createBuffer();
+ isBuffer = gl.isBuffer(buffer);
+ assertMsgOptions(!isBuffer, 'Got invalid boolean value', false, true);
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+ isBuffer = gl.isBuffer(buffer);
+ assertMsgOptions(isBuffer, 'Got invalid boolean value', false, true);
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
+ gl.deleteBuffer(buffer);
+ isBuffer = gl.isBuffer(buffer);
+ assertMsgOptions(!isBuffer, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_framebuffer', 'Invalid gl.isFramebuffer() usage', gl, function() {
+ /** @type{WebGLFramebuffer} */ var fbo;
+ /** @type{boolean} */ var isFbo;
+
+ bufferedLogToConsole('A name returned by glGenFramebuffers, but not yet bound through a call to gl.bindFramebuffer is not the name of a framebuffer object.');
+ isFbo = gl.isFramebuffer(fbo);
+ assertMsgOptions(!isFbo, 'Got invalid boolean value', false, true);
+
+ fbo = gl.createFramebuffer();
+ isFbo = gl.isFramebuffer(fbo);
+ assertMsgOptions(!isFbo, 'Got invalid boolean value', false, true);
+
+ gl.bindFramebuffer (gl.FRAMEBUFFER, fbo);
+ isFbo = gl.isFramebuffer(fbo);
+ assertMsgOptions(isFbo, 'Got invalid boolean value', false, true);
+
+ gl.bindFramebuffer (gl.FRAMEBUFFER, null);
+ gl.deleteFramebuffer(fbo);
+ isFbo = gl.isFramebuffer(fbo);
+ assertMsgOptions(!isFbo, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_program', 'Invalid gl.isProgram() usage', gl, function() {
+ /** @type{WebGLProgram} */ var program;
+ /** @type{boolean} */ var isProgram;
+
+ bufferedLogToConsole('A name created with gl.createProgram, and not yet deleted with glDeleteProgram is a name of a program object.');
+ isProgram = gl.isProgram(program);
+ assertMsgOptions(!isProgram, 'Got invalid boolean value', false, true);
+
+ program = gl.createProgram();
+ isProgram = gl.isProgram(program);
+ assertMsgOptions(isProgram, 'Got invalid boolean value', false, true);
+
+ gl.deleteProgram(program);
+ isProgram = gl.isProgram(program);
+ assertMsgOptions(!isProgram, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_renderbuffer', 'Invalid gl.isRenderbuffer() usage', gl, function() {
+ /** @type{WebGLRenderbuffer} */ var rbo;
+ /** @type{boolean} */ var isRbo;
+
+ bufferedLogToConsole('A name returned by glGenRenderbuffers, but not yet bound through a call to gl.bindRenderbuffer or gl.framebufferRenderbuffer is not the name of a renderbuffer object.');
+ isRbo = gl.isRenderbuffer(rbo);
+ assertMsgOptions(!isRbo, 'Got invalid boolean value', false, true);
+
+ rbo = gl.createRenderbuffer();
+ isRbo = gl.isRenderbuffer(rbo);
+ assertMsgOptions(!isRbo, 'Got invalid boolean value', false, true);
+
+ gl.bindRenderbuffer (gl.RENDERBUFFER, rbo);
+ isRbo = gl.isRenderbuffer(rbo);
+ assertMsgOptions(isRbo, 'Got invalid boolean value', false, true);
+
+ gl.bindRenderbuffer (gl.RENDERBUFFER, null);
+ gl.deleteRenderbuffer(rbo);
+ isRbo = gl.isRenderbuffer(rbo);
+ assertMsgOptions(!isRbo, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_shader', 'Invalid gl.isShader() usage', gl, function() {
+ /** @type{WebGLShader} */ var shader;
+ /** @type{boolean} */ var isShader;
+
+ bufferedLogToConsole('A name created with glCreateShader, and not yet deleted with glDeleteShader is a name of a shader object.');
+ isShader = gl.isProgram(shader);
+ assertMsgOptions(!isShader, 'Got invalid boolean value', false, true);
+
+ shader = gl.createShader(gl.VERTEX_SHADER);
+ isShader = gl.isShader(shader);
+ assertMsgOptions(isShader, 'Got invalid boolean value', false, true);
+
+ gl.deleteShader (shader);
+ isShader = gl.isShader(shader);
+ assertMsgOptions(!isShader, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_texture', 'Invalid gl.isTexture() usage', gl, function() {
+ /** @type{WebGLTexture} */ var texture;
+ /** @type{boolean} */ var isTexture;
+
+ bufferedLogToConsole('A name returned by glGenTextures, but not yet bound through a call to glBindTexture is not the name of a texture.');
+ isTexture = gl.isTexture(texture);
+ assertMsgOptions(!isTexture, 'Got invalid boolean value', false, true);
+
+ texture = gl.createTexture();
+ isTexture = gl.isTexture(texture);
+ assertMsgOptions(!isTexture, 'Got invalid boolean value', false, true);
+
+ gl.bindTexture (gl.TEXTURE_2D, texture);
+ isTexture = gl.isTexture(texture);
+ assertMsgOptions(isTexture, 'Got invalid boolean value', false, true);
+
+ gl.bindTexture (gl.TEXTURE_2D, null);
+ gl.deleteTexture(texture);
+ isTexture = gl.isTexture(texture);
+ assertMsgOptions(!isTexture, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_query', 'Invalid gl.isQuery() usage', gl, function() {
+ /** @type{WebGLQuery} */ var query;
+ /** @type{boolean} */ var isQuery;
+
+ bufferedLogToConsole('A name returned by glGenQueries, but not yet associated with a query object by calling gl.beginQuery, is not the name of a query object.');
+ isQuery = gl.isQuery(query);
+ assertMsgOptions(!isQuery, 'Got invalid boolean value', false, true);
+
+ query = gl.createQuery();
+ isQuery = gl.isQuery(query);
+ assertMsgOptions(!isQuery, 'Got invalid boolean value', false, true);
+
+ gl.beginQuery (gl.ANY_SAMPLES_PASSED, query);
+ isQuery = gl.isQuery(query);
+ assertMsgOptions(isQuery, 'Got invalid boolean value', false, true);
+
+ gl.endQuery (gl.ANY_SAMPLES_PASSED);
+ gl.deleteQuery (query);
+ isQuery = gl.isQuery(query);
+ assertMsgOptions(!isQuery, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_sampler', 'Invalid gl.isSampler() usage', gl, function() {
+ /** @type{WebGLSampler} */ var sampler;
+ /** @type{boolean} */ var isSampler;
+
+ bufferedLogToConsole('A name returned by glGenSamplers is the name of a sampler object.');
+ isSampler = gl.isSampler(sampler);
+ assertMsgOptions(!isSampler, 'Got invalid boolean value', false, true);
+
+ sampler = gl.createSampler();
+ isSampler = gl.isSampler(sampler);
+ assertMsgOptions(isSampler, 'Got invalid boolean value', false, true);
+
+ gl.bindSampler(0, sampler);
+ isSampler = gl.isSampler(sampler);
+ assertMsgOptions(isSampler, 'Got invalid boolean value', false, true);
+
+ gl.deleteSampler(sampler);
+ isSampler = gl.isSampler(sampler);
+ assertMsgOptions(!isSampler, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_sync', 'Invalid gl.isSync() usage', gl, function() {
+ /** @type{WebGLSync} */ var sync;
+ /** @type{boolean} */ var isSync;
+
+ bufferedLogToConsole('A name returned by gl.fenceSync is the name of a sync object.');
+ isSync = gl.isSync(sync);
+ assertMsgOptions(!isSync, 'Got invalid boolean value', false, true);
+
+ sync = gl.fenceSync (gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
+ isSync = gl.isSync(sync);
+ assertMsgOptions(isSync, 'Got invalid boolean value', false, true);
+
+ gl.deleteSync (sync);
+ isSync = gl.isSync(sync);
+ assertMsgOptions(!isSync, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_transform_feedback', 'Invalid gl.isTransformFeedback() usage', gl, function() {
+ /** @type{WebGLTransformFeedback} */ var tf;
+ /** @type{boolean} */ var isTF;
+
+ bufferedLogToConsole('A name returned by glGenTransformFeedbacks, but not yet bound using glBindTransformFeedback, is not the name of a transform feedback object.');
+ isTF = gl.isTransformFeedback(tf);
+ assertMsgOptions(!isTF, 'Got invalid boolean value', false, true);
+
+ tf = gl.createTransformFeedback();
+ isTF = gl.isTransformFeedback(tf);
+ assertMsgOptions(!isTF, 'Got invalid boolean value', false, true);
+
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, tf);
+ isTF = gl.isTransformFeedback(tf);
+ assertMsgOptions(isTF, 'Got invalid boolean value', false, true);
+
+ gl.bindTransformFeedback (gl.TRANSFORM_FEEDBACK, null);
+ gl.deleteTransformFeedback (tf);
+ isTF = gl.isTransformFeedback(tf);
+ assertMsgOptions(!isTF, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+
+ testGroup.addChild(new es3fApiCase.ApiCaseCallback('is_vertex_array', 'Invalid gl.isVertexArray() usage', gl, function() {
+ /** @type{WebGLVertexArrayObject} */ var vao;
+ /** @type{boolean} */ var isVao;
+
+ bufferedLogToConsole('A name returned by glGenVertexArrays, but not yet bound using glBindVertexArray, is not the name of a vertex array object.');
+ isVao = gl.isVertexArray(vao);
+ assertMsgOptions(!isVao, 'Got invalid boolean value', false, true);
+
+ vao = gl.createVertexArray();
+ isVao = gl.isVertexArray(vao);
+ assertMsgOptions(!isVao, 'Got invalid boolean value', false, true);
+
+ gl.bindVertexArray (vao);
+ isVao = gl.isVertexArray(vao);
+ assertMsgOptions(isVao, 'Got invalid boolean value', false, true);
+
+ gl.bindVertexArray (null);
+ gl.deleteVertexArray (vao);
+ isVao = gl.isVertexArray(vao);
+ assertMsgOptions(!isVao, 'Got invalid boolean value', false, true);
+
+ this.expectError (gl.NO_ERROR);
+ }));
+ };
+
+ /**
+ * @param {WebGL2RenderingContext} gl
+ */
+ es3fNegativeStateApiTests.run = function(gl) {
+ var testName = 'state';
+ var testDescription = 'Negative GL State API Cases';
+ var state = tcuTestCase.runner;
+
+ state.testName = testName;
+ state.testCases = tcuTestCase.newTest(testName, testDescription, null);
+
+ //Set up name and description of this test series.
+ setCurrentTestName(testName);
+ description(testDescription);
+ try {
+ es3fNegativeStateApiTests.init(gl);
+ tcuTestCase.runner.runCallback(tcuTestCase.runTestCases);
+ } catch (err) {
+ bufferedLogToConsole(err);
+ tcuTestCase.runner.terminate();
+ }
+ };
+
+});