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

258 lines
5.7 KiB
JavaScript

const { assert, test, module: describe, only } = require('qunit');
const { WebGLFunctionNode } = require(process.cwd() + '/src');
describe('WebGLFunctionNode.getDependencies()');
test('safe from literal 1', () => {
const node = new WebGLFunctionNode(`function kernel() {
const const1 = 1;
const const2 = const1 + 2;
const const3 = const2 + 3;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1] });
node.toString();
assert.equal(node.declarations[0].isSafe, true);
assert.deepEqual(node.declarations[0].dependencies, [
{
origin: 'literal',
value: 1,
isSafe: true,
}
]);
assert.equal(node.declarations[1].isSafe, true);
assert.deepEqual(node.declarations[1].dependencies, [
{
name: 'const1',
origin: 'declaration',
isSafe: true
},{
origin: 'literal',
value: 2,
isSafe: true,
}
]);
assert.equal(node.declarations[2].isSafe, true);
assert.deepEqual(node.declarations[2].dependencies, [
{
name: 'const2',
origin: 'declaration',
isSafe: true
},{
origin: 'literal',
value: 3,
isSafe: true,
}
]);
});
test('safe from argument', () => {
const node = new WebGLFunctionNode(`function kernel(arg1) {
const const1 = arg1 + 3;
const const2 = const1 + 2;
const const3 = const2 + 1;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1], argumentTypes: ['Number'] });
node.toString();
assert.equal(node.declarations[0].isSafe, false);
assert.deepEqual(node.declarations[0].dependencies, [
{
name: 'arg1',
origin: 'argument',
isSafe: false
},{
origin: 'literal',
value: 3,
isSafe: true,
}
]);
assert.equal(node.declarations[1].isSafe, false);
assert.deepEqual(node.declarations[1].dependencies, [
{
name: 'const1',
origin: 'declaration',
isSafe: false
},{
origin: 'literal',
value: 2,
isSafe: true,
}
]);
assert.equal(node.declarations[2].isSafe, false);
assert.deepEqual(node.declarations[2].dependencies, [
{
name: 'const2',
origin: 'declaration',
isSafe: false
},{
origin: 'literal',
value: 1,
isSafe: true,
}
]);
});
test('safe from multiplication', () => {
const node = new WebGLFunctionNode(`function kernel() {
const const1 = 555;
const const2 = const1 + .555;
const const3 = const2 * .1;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1] });
node.toString();
assert.deepEqual(node.declarations[0].dependencies, [
{
origin: 'literal',
value: 555,
isSafe: true,
}
]);
assert.deepEqual(node.declarations[1].dependencies, [
{
name: 'const1',
origin: 'declaration',
isSafe: true,
},{
origin: 'literal',
value: .555,
isSafe: true,
}
]);
assert.deepEqual(node.declarations[2].dependencies, [
{
name: 'const2',
origin: 'declaration',
isSafe: false,
},{
origin: 'literal',
value: .1,
isSafe: false,
}
]);
});
test('safe from multiplication deep', () => {
const node = new WebGLFunctionNode(`function kernel() {
const const1 = 555 * 1;
const const2 = const1 + .555;
const const3 = .1 - const2;
const const4 = const3 - .1;
const const5 = .1 - const4;
const const6 = const5 - .1;
const const7 = .1 - const6;
const const8 = const7 - .1;
const const9 = .1 - const8;
const const10 = const9 + 10;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1] });
node.toString();
assert.ok(node.declarations[0].dependencies.every(dependency => dependency.isSafe === false));
assert.deepEqual(node.declarations[9].dependencies, [
{
name: 'const9',
origin: 'declaration',
isSafe: false,
},{
origin: 'literal',
value: 10,
isSafe: true,
}
]);
});
test('safe from division', () => {
const node = new WebGLFunctionNode(`function kernel() {
const const1 = 555;
const const2 = const1 + .555;
const const3 = const2 / .1;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1] });
node.toString();
assert.deepEqual(node.declarations[0].dependencies, [
{
origin: 'literal',
value: 555,
isSafe: true,
}
]);
assert.deepEqual(node.declarations[1].dependencies, [
{
name: 'const1',
origin: 'declaration',
isSafe: true,
},{
origin: 'literal',
value: .555,
isSafe: true,
}
]);
assert.deepEqual(node.declarations[2].dependencies, [
{
name: 'const2',
origin: 'declaration',
isSafe: false,
},{
origin: 'literal',
value: .1,
isSafe: false,
}
]);
});
test('safe from division deep', () => {
const node = new WebGLFunctionNode(`function kernel() {
const const1 = 555 / 1;
const const2 = const1 + .555;
const const3 = .1 - const2;
const const4 = .1 - const3;
const const5 = const4 - .1;
const const6 = const5 - .1;
const const7 = .1 - const6;
const const8 = const7 - .1;
const const9 = .1 - const8;
const const10 = const9 + 10;
let sum = 0;
for (let i = 0; i < const3; i++) {
sum += const3;
}
}`, { output: [1] });
node.toString();
assert.ok(node.declarations[0].dependencies.every(dependency => dependency.isSafe === false));
assert.deepEqual(node.declarations[9].dependencies, [
{
name: 'const9',
origin: 'declaration',
isSafe: false,
},{
origin: 'literal',
value: 10,
isSafe: true,
}
]);
});