Skip to content

Commit 592b9e8

Browse files
committed
test it does not delete existing shaders
fix async tests
1 parent 8e3447f commit 592b9e8

File tree

3 files changed

+66
-31
lines changed

3 files changed

+66
-31
lines changed

src/programs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ function getShaderTypeFromScriptType(gl, scriptType) {
698698
function deleteProgramAndShaders(gl, program, notThese) {
699699
const shaders = gl.getAttachedShaders(program);
700700
for (const shader of shaders) {
701-
if (notThese.has(shader)) {
701+
if (!notThese.has(shader)) {
702702
gl.deleteShader(shader);
703703
}
704704
}

test/tests/program-tests.js

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
createContext2,
1313
checkColor,
1414
itWebGL,
15+
fnWithCallbackToPromise,
1516
} from '../webgl.js';
1617

1718
class MsgCapturer {
@@ -105,9 +106,9 @@ describe('program tests', () => {
105106
assertTruthy(msgCapturer.hasMsgs());
106107
});
107108

108-
itWebGL('works async with callback', function(done) {
109+
itWebGL('works async with callback', async function() {
109110
const {gl} = createContext();
110-
const programInfo = twgl.createProgramInfo(gl, [
111+
const programInfo = await fnWithCallbackToPromise(twgl.createProgramInfo)(gl, [
111112
`void main() {gl_Position = vec4(0); }`,
112113
`precision mediump float;
113114
uniform vec4 u_foo;
@@ -122,16 +123,16 @@ describe('program tests', () => {
122123
assertTruthy(gl.getProgramParameter(programInfo.program, gl.LINK_STATUS));
123124
gl.useProgram(programInfo.program);
124125
gl.drawArrays(gl.TRIANGLES, 0, 3);
125-
done();
126+
assertNoWebGLError(gl);
126127
},
127128
});
128129
assertFalsy(programInfo);
129130
});
130131

131-
itWebGL('works async with callback with bad shader', function(done) {
132+
itWebGL('works async with callback with bad shader', async function() {
132133
const {gl} = createContext();
133134
const msgs = [];
134-
const programInfo = twgl.createProgramInfo(gl, [
135+
const programInfo = await fnWithCallbackToPromise(twgl.createProgramInfo)(gl, [
135136
`void main() {gl_Position = vec4(0); }`,
136137
`precision mediump float;
137138
uniform vec4 u_foo;
@@ -146,16 +147,15 @@ describe('program tests', () => {
146147
assertTruthy(err);
147148
assertFalsy(programInfo);
148149
assertTruthy(msgs.length > 0);
149-
done();
150150
},
151151
});
152152
assertFalsy(programInfo);
153153
});
154154

155-
itWebGL('works async with callback missing shader', function(done) {
155+
itWebGL('works async with callback missing shader', async function() {
156156
const {gl} = createContext();
157157
const msgs = [];
158-
const programInfo = twgl.createProgramInfo(gl, [
158+
const programInfo = await fnWithCallbackToPromise(twgl.createProgramInfo)(gl, [
159159
`void main() {gl_Position = vec4(0); }`,
160160
], {
161161
errorCallback(msg) {
@@ -165,7 +165,6 @@ describe('program tests', () => {
165165
assertTruthy(err);
166166
assertFalsy(programInfo);
167167
assertTruthy(msgs.length > 0);
168-
done();
169168
},
170169
});
171170
assertFalsy(programInfo);
@@ -364,9 +363,28 @@ describe('program tests', () => {
364363
assertFalsy(msgCapturer.hasMsgs());
365364
});
366365

367-
itWebGL('compiles program async with callback', function(done) {
366+
itWebGL('does not delete existing shaders', () => {
368367
const {gl} = createContext();
369-
const program = twgl.createProgram(gl, [
368+
const msgCapturer = new MsgCapturer();
369+
const vs = gl.createShader(gl.VERTEX_SHADER);
370+
gl.shaderSource(vs, `void main() { gl_Position = vec4(0); }`);
371+
gl.compileShader(vs);
372+
const fsBad = `precision mediump float; void main() { gl_FragColorS = vec4(0); }`;
373+
const programBad = twgl.createProgram(gl, [vs, fsBad], {
374+
errorCallback: () => {},
375+
});
376+
assertFalsy(programBad);
377+
const fsGood = `precision mediump float; void main() { gl_FragColor = vec4(0); }`;
378+
const programGood = twgl.createProgram(gl, [vs, fsGood], {
379+
errorCallback: msgCapturer.cb,
380+
});
381+
assertTruthy(programGood instanceof WebGLProgram);
382+
assertFalsy(msgCapturer.hasMsgs());
383+
});
384+
385+
itWebGL('compiles program async with callback', async function() {
386+
const {gl} = createContext();
387+
const program = await fnWithCallbackToPromise(twgl.createProgram)(gl, [
370388
`void main() { gl_Position = vec4(0); }`,
371389
`precision mediump float; void main() { gl_FragColor = vec4(0); }`,
372390
], {
@@ -377,16 +395,15 @@ describe('program tests', () => {
377395
gl.useProgram(program);
378396
gl.drawArrays(gl.TRIANGLES, 0, 3);
379397
assertEqual(gl.getError(), gl.NONE);
380-
done();
381398
},
382399
});
383400
assertFalsy(program); // nothing is returned if callback
384401
});
385402

386-
itWebGL('compiles program async with callback with error', function(done) {
403+
itWebGL('compiles program async with callback with error', async function() {
387404
const {gl} = createContext();
388405
const msgs = [];
389-
const program = twgl.createProgram(gl, [
406+
const program = await fnWithCallbackToPromise(twgl.createProgram)(gl, [
390407
`void main() { gl_Position = vec4(0); }`,
391408
`precision mediump float; void main() { gl_Frag Color = vec4(0); }`,
392409
], {
@@ -397,7 +414,6 @@ describe('program tests', () => {
397414
assertTruthy(err);
398415
assertFalsy(program);
399416
assertTruthy(msgs.length > 0);
400-
done();
401417
},
402418
});
403419
assertFalsy(program); // nothing is returned if callback
@@ -1017,9 +1033,9 @@ describe('program tests', () => {
10171033
assertTruthy(msgCapturer.hasMsgs());
10181034
});
10191035

1020-
itWebGL('compiles program async with callback', function(done) {
1036+
itWebGL('compiles program async with callback', async function() {
10211037
const {gl} = createContext();
1022-
const program = twgl.createProgramFromScripts(gl, addShaderScripts([
1038+
const program = await fnWithCallbackToPromise(twgl.createProgramFromScripts)(gl, addShaderScripts([
10231039
`void main() { gl_Position = vec4(0); }`,
10241040
`precision mediump float; void main() { gl_FragColor = vec4(0); }`,
10251041
]), {
@@ -1030,16 +1046,15 @@ describe('program tests', () => {
10301046
gl.useProgram(program);
10311047
gl.drawArrays(gl.TRIANGLES, 0, 3);
10321048
assertEqual(gl.getError(), gl.NONE);
1033-
done();
10341049
},
10351050
});
10361051
assertFalsy(program); // nothing is returned if callback
10371052
});
10381053

1039-
itWebGL('compiles program async with callback with error', function(done) {
1054+
itWebGL('compiles program async with callback with error', async function() {
10401055
const {gl} = createContext();
10411056
const msgs = [];
1042-
const program = twgl.createProgramFromScripts(gl, addShaderScripts([
1057+
const program = await fnWithCallbackToPromise(twgl.createProgramFromScripts)(gl, addShaderScripts([
10431058
`void main() { gl_Position = vec4(0); }`,
10441059
`precision mediump float; void main() { gl_Frag Color = vec4(0); }`,
10451060
]), {
@@ -1050,16 +1065,15 @@ describe('program tests', () => {
10501065
assertTruthy(err);
10511066
assertFalsy(program);
10521067
assertTruthy(msgs.length > 0);
1053-
done();
10541068
},
10551069
});
10561070
assertFalsy(program); // nothing is returned if callback
10571071
});
10581072

1059-
itWebGL('compiles program async with callback with bad ids', function(done) {
1073+
itWebGL('compiles program async with callback with bad ids', async function() {
10601074
const {gl} = createContext();
10611075
const msgs = [];
1062-
const program = twgl.createProgramFromScripts(gl, addShaderScripts([
1076+
const program = await fnWithCallbackToPromise(twgl.createProgramFromScripts)(gl, addShaderScripts([
10631077
`idThatDoesNotExist`,
10641078
]), {
10651079
errorCallback(msg) {
@@ -1069,7 +1083,6 @@ describe('program tests', () => {
10691083
assertTruthy(err);
10701084
assertFalsy(program);
10711085
assertTruthy(msgs.length > 0);
1072-
done();
10731086
},
10741087
});
10751088
assertFalsy(program); // nothing is returned if callback
@@ -1117,9 +1130,9 @@ describe('program tests', () => {
11171130
assertTruthy(msgCapturer.hasMsgs());
11181131
});
11191132

1120-
itWebGL('compiles program async with callback', function(done) {
1133+
itWebGL('compiles program async with callback', async function() {
11211134
const {gl} = createContext();
1122-
const program = twgl.createProgramFromSources(gl, [
1135+
const program = await fnWithCallbackToPromise(twgl.createProgramFromSources)(gl, [
11231136
`void main() { gl_Position = vec4(0); }`,
11241137
`precision mediump float; void main() { gl_FragColor = vec4(0); }`,
11251138
], {
@@ -1130,16 +1143,15 @@ describe('program tests', () => {
11301143
gl.useProgram(program);
11311144
gl.drawArrays(gl.TRIANGLES, 0, 3);
11321145
assertEqual(gl.getError(), gl.NONE);
1133-
done();
11341146
},
11351147
});
11361148
assertFalsy(program); // nothing is returned if callback
11371149
});
11381150

1139-
itWebGL('compiles program async with callback with error', function(done) {
1151+
itWebGL('compiles program async with callback with error', async function() {
11401152
const {gl} = createContext();
11411153
const msgs = [];
1142-
const program = twgl.createProgramFromSources(gl, [
1154+
const program = await fnWithCallbackToPromise(twgl.createProgramFromSources)(gl, [
11431155
`void main() { gl_Position = vec4(0); }`,
11441156
`precision mediump float; void main() { gl_Frag Color = vec4(0); }`,
11451157
], {
@@ -1150,7 +1162,6 @@ describe('program tests', () => {
11501162
assertTruthy(err);
11511163
assertFalsy(program);
11521164
assertTruthy(msgs.length > 0);
1153-
done();
11541165
},
11551166
});
11561167
assertFalsy(program); // nothing is returned if callback

test/webgl.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@ export function assertNoWebGLError(gl, msg = '') {
1010
assertWebGLError(gl, gl.NO_ERROR, msg);
1111
}
1212

13+
export function fnWithCallbackToPromise(fn) {
14+
return async function(...args) {
15+
const callbackPromises = args
16+
.filter(arg => typeof arg === 'object' && 'callback' in arg)
17+
.map(arg => {
18+
const callback = arg.callback;
19+
const p = Promise.withResolvers();
20+
const newCallback = (...args) => {
21+
try {
22+
callback(...args);
23+
p.resolve();
24+
} catch (e) {
25+
p.reject(e);
26+
}
27+
};
28+
arg.callback = newCallback;
29+
return p.promise;
30+
});
31+
const result = fn(...args);
32+
await Promise.all(callbackPromises);
33+
return result;
34+
};
35+
}
36+
1337
export function createContext() {
1438
const gl = document.createElement('canvas').getContext('webgl');
1539
return { gl };

0 commit comments

Comments
 (0)