<!DOCTYPE html>
<html>
  <head>
    <title>WebGL BindBuffer conformance test.</title>
    <script src="../../../resources/js-test.js"></script>
    <script src="resources/webgl-test.js"> </script>
</head>
<body>
<canvas id="example" width="40" height="40" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
description("Checks a buffer can only be bound to 1 target.");

debug("");
debug("Canvas.getContext");

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

var gl = create3DContext(document.getElementById("canvas"));
if (!gl) {
  testFailed("context does not exist");
} else {
  testPassed("context exists");

  debug("");

  var buf = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, buf);
  assertMsg(gl.getError() == gl.NO_ERROR,
            "should be able to bind buffer.");
  gl.bindBuffer(gl.ARRAY_BUFFER, null);
  assertMsg(gl.getError() == gl.NO_ERROR,
            "should be able to unbind buffer.");
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);
  assertMsg(gl.getError() == gl.INVALID_OPERATION,
            "should get INVALID_OPERATION if attempting to bind buffer to different target");

  var buf = gl.createBuffer();
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buf);
  assertMsg(gl.getError() == gl.NO_ERROR,
            "should be able to bind buffer.");
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
  assertMsg(gl.getError() == gl.NO_ERROR,
            "should be able to unbind buffer.");
  gl.bindBuffer(gl.ARRAY_BUFFER, buf);
  assertMsg(gl.getError() == gl.INVALID_OPERATION,
            "should get INVALID_OPERATION if attempting to bind buffer to different target");
}

debug("");
</script>
</body>
</html>

