gpu.js/test/internal/backend/web-gl/function-node/getVariableSignature.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

156 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}; }`,
traceFunctionAST: () => {}
};
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]'), 'this.constants.value[][][][]');
});
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]');
});
});