gpu.js/test/internal/backend/web-gl/function-node/getVariableSignature.js
Robert Plummer 0cce0a0a82 fix: Clone GPU for loop into CPU
Add unit tests to browser all.html
fix a typo in file and in desc
Add a few missing items to index.d.ts
Move debug console.log to match GPU counterpart
Build files
All unit tests pass or skip (when appropriate) for Chrome, Firefox, Safari, and Node
This marks v1 rc1.
2019-02-10 22:58:18 -05:00

155 lines
4.8 KiB
JavaScript

const { assert, test, module: describe, only } = require('qunit');
const { WebGLFunctionNode } = require(process.cwd() + '/src');
describe('WebGLFunctionNode.getVariableSignature()');
function run(value) {
const mockInstance = {
source: `function() { ${value}; }`
};
const ast = WebGLFunctionNode.prototype.getJsAST.call(mockInstance);
const expression = ast.body.body[0].expression;
return WebGLFunctionNode.prototype.getVariableSignature.call({
isAstVariable: WebGLFunctionNode.prototype.isAstVariable
}, expression);
}
test('value', () => {
assert.equal(run('value'), 'value');
});
test('value[number]', () => {
assert.equal(run('value[0]'), 'value[]');
});
test('value[variable]', () => {
assert.equal(run('value[a]'), 'value[]');
});
test('value[variable] with conflicting names x', () => {
assert.equal(run('value[x]'), 'value[]');
});
test('value[variable] with conflicting names y', () => {
assert.equal(run('value[y]'), 'value[]');
});
test('value[variable] with conflicting names z', () => {
assert.equal(run('value[z]'), 'value[]');
});
test('value[this.thread.x]', () => {
assert.equal(run('value[this.thread.x]'), 'value[]');
});
test('value[this.thread.x][variable]', () => {
assert.equal(run('value[this.thread.x][a]'), 'value[][]');
});
test('value[variable] with conflicting names constants', () => {
assert.equal(run('value[constants]'), 'value[]');
});
test('value[variable] with conflicting names constants', () => {
assert.equal(run('value[output]'), 'value[]');
});
test('value[variable] with conflicting names thread', () => {
assert.equal(run('value[thread]'), 'value[]');
});
test('value[number][number]', () => {
assert.equal(run('value[0][0]'), 'value[][]');
});
test('value[variable][variable]', () => {
assert.equal(run('value[a][b]'), 'value[][]');
});
test('value[number][number][number]', () => {
assert.equal(run('value[0][0][0]'), 'value[][][]');
});
test('value[variable][variable][variable]', () => {
assert.equal(run('value[a][b][c]'), 'value[][][]');
});
test('this.thread.value', () => {
assert.equal(run('this.thread.x'), 'this.thread.value');
assert.equal(run('this.thread.y'), 'this.thread.value');
assert.equal(run('this.thread.z'), 'this.thread.value');
});
test('this.output.value', () => {
assert.equal(run('this.output.x'), 'this.output.value');
assert.equal(run('this.output.y'), 'this.output.value');
assert.equal(run('this.output.z'), 'this.output.value');
});
test('this.constants.value', () => {
assert.equal(run('this.constants.value'), 'this.constants.value');
});
test('this.constants.value[]', () => {
assert.equal(run('this.constants.value[0]'), 'this.constants.value[]');
});
test('this.constants.value[][]', () => {
assert.equal(run('this.constants.value[0][0]'), 'this.constants.value[][]');
});
test('this.constants.value[][][]', () => {
assert.equal(run('this.constants.value[0][0][0]'), 'this.constants.value[][][]');
});
test('this.constants.texture[this.thread.z][this.thread.y][this.thread.x]', () => {
assert.equal(run('this.constants.texture[this.thread.z][this.thread.y][this.thread.x]'), 'this.constants.value[][][]');
});
test('this.whatever.value', () => {
assert.equal(run('this.whatever.value'), null);
});
test('this.constants.value[][][][]', () => {
assert.equal(run('this.constants.value[0][0][0][0]'), null);
});
test('this.constants.value.something', () => {
assert.equal(run('this.constants.value.something'), null);
});
test('this.constants.value[].something', () => {
assert.equal(run('this.constants.value[0].something'), null);
});
test('this.constants.value[][].something', () => {
assert.equal(run('this.constants.value[0][0].something'), null);
});
test('this.constants.value[][][][]', () => {
assert.equal(run('this.constants.value[0][0][0].something'), null);
});
test('complex nested this.constants.value[][][]', () => {
assert.equal(run(`
this.constants.value[
this.constants.value[i + 1]
]
[
Math.random() * 1 + this.thread.x
]
[
this.thread.x - 100
]
`), 'this.constants.value[][][]');
});
test('complex nested with function call this.constants.value[][][]', () => {
assert.equal(run(`
this.constants.value[
something()
]
[
Math.random() * 1 + this.thread.x
]
[
this.thread.x - 100
]
`), 'this.constants.value[][][]')
});
test('non-existent something', () => {
assert.equal(run('this.constants.value[0][0].something'), null);
});
test('non-existent constants', () => {
assert.equal(run('this.constants.value[0][0].constants'), null);
});
test('function call', () => {
assert.throws(() => {
run('Math.random()');
});
});
test('binary expression add', () => {
assert.throws(() => {
run('value[0] + value[0]');
});
});
test('binary expression divide', () => {
assert.throws(() => {
run('value[0] / value[0]');
});
});