<html>
  <head>
<meta charset="utf-8">
    <title>WebGL sampler uniforms conformance test.</title>
    <script src="../../../resources/js-test.js"></script>
    <script src="resources/webgl-test.js"> </script>
    <script src="resources/webgl-test-utils.js"></script>
</head>
<body>
<canvas id="example" width="2" height="2" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>

  <script>
"use strict";
function init()
{
  description(
      "Tests that only Uniform1i and Uniform1iv can be used to set" +
      "sampler uniforms.");

 if (window.internals)
    window.internals.settings.setWebGLErrorsToConsoleEnabled(false);

  var canvas2d = document.getElementById("canvas2d");

  var wtu = WebGLTestUtils;
  var gl = wtu.create3DContext("example");
  var program = wtu.setupTexturedQuad(gl);

  var textureLoc = gl.getUniformLocation(program, "tex");
  var testInt32Array = new Int32Array(1);

  gl.uniform1i(textureLoc, 1);
  glErrorShouldBe(gl, gl.NO_ERROR,
            "uniform1i can set a sampler uniform");
  gl.uniform1iv(textureLoc, [1]);
  glErrorShouldBe(gl, gl.NO_ERROR,
            "uniform1iv can set a sampler uniform");
  gl.uniform1iv(textureLoc, testInt32Array);
  glErrorShouldBe(gl, gl.NO_ERROR,
            "uniform1iv can set a sampler uniform");
  gl.uniform1f(textureLoc, 1);
  glErrorShouldBe(gl, gl.INVALID_OPERATION,
            "uniform1f returns INVALID_OPERATION if attempting to set a sampler uniform");
  gl.uniform1fv(textureLoc, [1]);
  glErrorShouldBe(gl, gl.INVALID_OPERATION,
            "uniform1fv returns INVALID_OPERATION if attempting to set a sampler uniform");

  var maxTextureUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);

  var success = true;
  for (var ii = 0; ii < maxTextureUnits; ++ii) {
    gl.uniform1i(textureLoc, ii);
    success = success && (gl.getError() == gl.NO_ERROR);
  }
  expectTrue(success, "uniform1i works for any valid texture unit");

  var success = true;
  for (var ii = 0; ii < maxTextureUnits; ++ii) {
    gl.uniform1iv(textureLoc, [ii]);
    success = success && (gl.getError() == gl.NO_ERROR);
  }
  expectTrue(success, "uniform1iv works for any valid texture unit");

  var success = true;
  for (var ii = maxTextureUnits; ii < 0x10000; ++ii) {
    gl.uniform1i(textureLoc, ii);
    success = success && (gl.getError() == gl.INVALID_VALUE);
  }
  expectTrue(success, "uniform1i generates INVALID_VALUE for invalid texture units");

  var success = true;
  for (var ii = maxTextureUnits; ii < 0x10000; ++ii) {
    gl.uniform1iv(textureLoc, [ii]);
    success = success && (gl.getError() == gl.INVALID_VALUE);
  }
  expectTrue(success, "uniform1iv generates INVALID_VALUE for invalid texture units");

}

init();
</script>
</body>
</html>

