<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--

/*
** 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.
*/

-->
<link rel="stylesheet" type="text/css" href="../unit.css" />
<script type="application/javascript" src="../unit.js"></script>
<script type="application/javascript" src="../util.js"></script>
<script type="application/javascript">

Tests.startUnit = function () {
  var canvas = document.getElementById('gl');
  var gl = wrapGLContext(getGLContext(canvas));
  return [gl];
}

Tests.testBindBufferARRAY_BUFFER = function(gl) {
  var b = gl.createBuffer();
  assertOk("bind buffer", function(){gl.bindBuffer(gl.ARRAY_BUFFER, b)});
  assertFail("bufferData to null buffer", function() {
    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([10]), gl.STATIC_DRAW);
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array([10]));
  });
  assertFail("bind to number", function(){
    gl.bindBuffer(gl.ARRAY_BUFFER, 1000000000);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([10]), gl.STATIC_DRAW);
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array([10]));
  });
  assertOk("bind to null", function(){gl.bindBuffer(gl.ARRAY_BUFFER, null)});
  gl.deleteBuffer(b);
}

Tests.testBindBufferELEMENT_ARRAY_BUFFER = function(gl) {
  var b = gl.createBuffer();
  assertOk("bind buffer", function(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, b)});
  assertFail("bufferData to null buffer", function() {
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Float32Array([10]), gl.STATIC_DRAW);
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array([10]));
  });
  assertFail("bind to number", function(){
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, 1000000000);
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Float32Array([10]), gl.STATIC_DRAW);
    gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array([10]));
  });
  assertOk("bind to null",
      function(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)});
  gl.deleteBuffer(b);
}
Tests.testBindBuffer = function(gl) {
    assertFail("bind ARRAY_BUFFER to number",
        function(){gl.bindBuffer(gl.ARRAY_BUFFER, 1);});
    assertFail("bind ELEMENT_ARRAY_BUFFER to number",
        function(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, 1);});
    assertFail("bind bad target",
        function(){gl.bindBuffer(gl.FLOAT, 0);});
    assertFail("bind ARRAY_BUFFER to string",
        function(){gl.bindBuffer(gl.ARRAY_BUFFER, "foo");});
    assertFail("bind ELEMENT_ARRAY_BUFFER to string",
        function(){gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, "foo");});
}

</script>

<style>canvas{ position:absolute; }</style>
</head><body>
  <canvas id="gl" width="1" height="1"></canvas>
</body></html>
