<!--

/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL getActiveAttrib conformance test.</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test-utils.js"> </script>
</head>
<body>
<canvas id="example" width="16" height="16"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
attribute $type attr0;
void main()
{
    gl_Position = vec4(0, 0, 0, attr0$access);
}
</script>
<script id="fshader" type="x-shader/x-fragment">
void main()
{
    gl_FragColor = vec4(0,1,0,1);
}
</script>
<script>
"use strict";
description("Tests getActiveAttrib for various types");

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

var tests = [
{ glType: gl.FLOAT,      size: 1, type: 'float', access: ''},
{ glType: gl.FLOAT_VEC2, size: 1, type: 'vec2',  access: '[1]'},
{ glType: gl.FLOAT_VEC3, size: 1, type: 'vec3',  access: '[2]'},
{ glType: gl.FLOAT_VEC4, size: 1, type: 'vec4',  access: '[3]'},
{ glType: gl.FLOAT_MAT2, size: 1, type: 'mat2',  access: '[1][1]'},
{ glType: gl.FLOAT_MAT3, size: 1, type: 'mat3',  access: '[2][2]'},
{ glType: gl.FLOAT_MAT4, size: 1, type: 'mat4',  access: '[3][3]'},
];

var source = document.getElementById('vshader').text;
var fs = wtu.loadShaderFromScript(gl, 'fshader', gl.FRAGMENT_SHADER);
for (var tt = 0; tt < tests.length; ++tt) {
  var t = tests[tt];
  var vs = wtu.loadShader(
      gl,
      source.replace('$type', t.type).replace('$access', t.access),
      gl.VERTEX_SHADER);
  var program = wtu.setupProgram(gl, [vs, fs]);
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "no errors from setup");
  var numAttribs = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
  var found = false;
  for (var ii = 0; ii < numAttribs; ++ii) {
    var info = gl.getActiveAttrib(program, ii);
    if (info.name == 'attr0') {
      found = true;
      assertMsg(info.type == t.glType,
                "type must be " + wtu.glEnumToString(gl, t.glType) + " was " +
                wtu.glEnumToString(gl, info.type));
      assertMsg(info.size == t.size,
                "size must be " + t.size + ' was ' + info.size);
    }
  }
  if (!found) {
    testFailed("attrib 'attr0' not found");
  }
}

var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>

</body>
</html>


