<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->
<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" src="quickCheckAPI.js"></script>

<script type="application/javascript">

// Test that all GL functions specified in ArgGenerators fail
// when called with randomly generated invalid arguments
// Works only on tests with checkArgValidity defined
Tests.testInvalidArgs = function() {
  var randomTestCount = 100;
  for (var name in ArgGenerators) {
    try {
      if (!GL[name])
        throw (new Error(name + " is missing from the WebGL context"));
      var argGen = ArgGenerators[name];
      var alreadyTriedArgs = {};
      if (!argGen.generate || !argGen.checkArgValidity) continue;
      // test each GL function with randomTestCount randomly generated valid args
      argGeneratorTestRunner(argGen, function(args, gen, setupVars) {
        var mutatedArgs;
        var foundArgs = false;
        for (var j=0; j<100; j++) {
          mutatedArgs = mutateArgs(args);
          var validArgs = false;
          try {
            validArgs = gen.checkArgValidity.apply(gen, mutatedArgs);
          } catch(e) {}
          if (!validArgs) {
            if (gen.noAlreadyTriedCheck) {
              foundArgs = true;
              break; // found new invalid args
            }
            var src = Object.toSource(mutatedArgs);
            if (!alreadyTriedArgs[src]) {
              alreadyTriedArgs[src] = true;
              foundArgs = true;
              break; // found new invalid args
            }
          }
        }
        if (!foundArgs)
          return true;
        var ok = false;
        var rv;
        // assert that GL function fails when called with invalid args
        assertFail("This should fail: "+name+"("+argsToString(mutatedArgs)+")",
          function(){
            GL.getError(); // clear off existing error
            rv = GL[name].apply(GL, mutatedArgs);
            throwError(GL, name);
            ok = true;
          });
        // if we need to cleanup the return value, do it here
        // e.g. calling gl.deleteBuffer(rv) after testing gl.createBuffer() above
        if (gen.returnValueCleanup && rv != null) {
          assertOk("Cleaning up return value after "+name+"("+argsToString(mutatedArgs)+")",
                   function() { gen.returnValueCleanup(rv); });
        }
        GL.getError();
        return !ok;
      }, argGen.testCount || randomTestCount);
    } catch(e) {
      testFailed(name, e.name, formatError(e));
    }
  }
}

</script>
<style>canvas{position:absolute;}</style>
</head><body>
</body></html>
