gpu.js/test/issues/31-nested-var-declare-test.js
Robert Plummer 7bcfbed234 feat: Pre type check with FunctionTracer
feat: Add cat demo
feat: Type check even on CPU
fix: ArrayTexture support as arguments for internal arrays
fix: Typo from "Interger" to "Integer"
feat: Bump and build version number
2019-06-17 18:00:36 -04:00

193 lines
5.3 KiB
JavaScript

const { assert, skip, test, module: describe, only } = require('qunit');
const { GPU, FunctionBuilder, WebGLFunctionNode, WebGL2FunctionNode, CPUFunctionNode } = require('../../src');
describe('issue #31 redeclare');
// nested redeclare
function nestedVarRedeclareFunction() {
let result = 0;
// outer loop limit is effectively skipped in CPU
for(let i=0; i<10; ++i) {
// inner loop limit should be higher, to avoid infinite loops
for(i=0; i<20; ++i) {
result += 1;
}
}
return result;
}
function nestedVarRedeclareTest(mode) {
const gpu = new GPU({ mode });
const f = gpu.createKernel(nestedVarRedeclareFunction, {
output: [1],
});
assert.throws(() => {
f();
});
gpu.destroy();
}
test('Issue #31 - nestedVarRedeclare auto', () => {
nestedVarRedeclareTest(null);
});
test('Issue #31 - nestedVarRedeclare gpu', () => {
nestedVarRedeclareTest('gpu');
});
(GPU.isWebGLSupported ? test : skip)('Issue #31 - nestedVarRedeclare webgl', () => {
nestedVarRedeclareTest('webgl');
});
(GPU.isWebGL2Supported ? test : skip)('Issue #31 - nestedVarRedeclare webgl2', () => {
nestedVarRedeclareTest('webgl2');
});
(GPU.isHeadlessGLSupported ? test : skip)('Issue #31 - nestedVarRedeclare headlessgl', () => {
nestedVarRedeclareTest('headlessgl');
});
test('Issue #31 - nestedVarRedeclare cpu', () => {
nestedVarRedeclareTest('cpu');
});
test('Issue #31 - nestedVarRedeclare : AST handling webgl', () => {
const builder = new FunctionBuilder({
functionNodes: [new WebGLFunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })],
output: [1]
});
assert.throws(() => {
builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']);
});
});
test('Issue #31 - nestedVarRedeclare : AST handling webgl2', () => {
const builder = new FunctionBuilder({
functionNodes: [new WebGL2FunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })],
output: [1]
});
assert.throws(() => {
builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']);
});
});
test('Issue #31 - nestedVarRedeclare : AST handling cpu', () => {
const builder = new FunctionBuilder({
functionNodes: [new CPUFunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })],
output: [1]
});
assert.throws(() => {
builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']);
});
});
describe('issue #31 nested declare');
// nested declare
function nestedVarDeclareFunction() {
let result = 0.0;
// outer loop limit is effectively skipped in CPU
for(let i=0; i<10; ++i) {
// inner loop limit should be higher, to avoid infinite loops
for(let i=0; i<20; ++i) {
result += 1;
}
}
return result;
}
function nestedVarDeclareTest(mode ) {
const gpu = new GPU({ mode });
const f = gpu.createKernel(nestedVarDeclareFunction, {
output : [1]
});
assert.equal(f(), 200, 'basic return function test');
gpu.destroy();
}
test('Issue #31 - nestedVarDeclare auto', () => {
nestedVarDeclareTest(null);
});
test('Issue #31 - nestedVarDeclare gpu', () => {
nestedVarDeclareTest('gpu');
});
(GPU.isWebGLSupported ? test : skip)('Issue #31 - nestedVarDeclare webgl', () => {
nestedVarDeclareTest('webgl');
});
(GPU.isWebGL2Supported ? test : skip)('Issue #31 - nestedVarDeclare webgl2', () => {
nestedVarDeclareTest('webgl2');
});
(GPU.isHeadlessGLSupported ? test : skip)('Issue #31 - nestedVarDeclare headlessgl', () => {
nestedVarDeclareTest('headlessgl');
});
test('Issue #31 - nestedVarDeclare cpu', () => {
nestedVarDeclareTest('cpu');
});
test('Issue #31 - nestedVarDeclare : AST handling webgl', () => {
const builder = new FunctionBuilder({
functionNodes: [new WebGLFunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })]
});
assert.equal(
builder.getStringFromFunctionNames(['nestedVarDeclareFunction']),
'float nestedVarDeclareFunction() {'
+ '\nfloat user_result=0.0;'
+ '\nfor (int user_i=0;(user_i<10);++user_i){'
+ '\nfor (int user_i=0;(user_i<20);++user_i){' //<-- Note: don't do this in real life!
+ '\nuser_result+=1.0;}'
+ '\n}'
+ '\n'
+ '\nreturn user_result;'
+ '\n}'
);
});
test('Issue #31 - nestedVarDeclare : AST handling webgl2', () => {
const builder = new FunctionBuilder({
functionNodes: [new WebGL2FunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })]
});
assert.equal(
builder.getStringFromFunctionNames(['nestedVarDeclareFunction']),
'float nestedVarDeclareFunction() {'
+ '\nfloat user_result=0.0;'
+ '\nfor (int user_i=0;(user_i<10);++user_i){'
+ '\nfor (int user_i=0;(user_i<20);++user_i){' //<-- Note: don't do this in real life!
+ '\nuser_result+=1.0;}'
+ '\n}'
+ '\n'
+ '\nreturn user_result;'
+ '\n}'
);
});
test('Issue #31 - nestedVarDeclare : AST handling cpu', () => {
const builder = new FunctionBuilder({
functionNodes: [new CPUFunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })]
});
assert.equal(
builder.getStringFromFunctionNames(['nestedVarDeclareFunction']),
'function nestedVarDeclareFunction() {'
+ '\nlet user_result=0;'
+ '\nfor (let user_i=0;(user_i<10);++user_i){'
+ '\nfor (let user_i=0;(user_i<20);++user_i){'
+ '\nuser_result+=1;}'
+ '\n}'
+ '\n'
+ '\nreturn user_result;'
+ '\n}'
);
});