• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import hilog from '@ohos.hilog';
17import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect, TestType, Level, Size } from '@ohos/hypium';
18
19import {checkError, createProgram, getColorUint8Array} from './WebGL1';
20
21
22export default function webgl1_program() {
23
24	describe('webgl1_program', function () {
25        let gl = global.gl;
26        // Defines a test suite. Two parameters are supported: test suite name and test suite function.
27        beforeAll(function () {
28            hilog.info(0x0000, 'testTag', '%{public}s', 'webgl1_test_01 start');
29            // Presets an action, which is performed only once before all test cases of the test suite start.
30            // This API supports only one parameter: preset action function.
31        })
32        beforeEach(function () {
33            // Presets an action, which is performed before each unit test case starts.
34            // The number of execution times is the same as the number of test cases defined by **it**.
35            // This API supports only one parameter: preset action function.
36            checkError(gl);
37        })
38        afterEach(function () {
39            // Presets a clear action, which is performed after each unit test case ends.
40            // The number of execution times is the same as the number of test cases defined by **it**.
41            // This API supports only one parameter: clear action function.
42            checkError(gl);
43        })
44        afterAll(function () {
45            // Presets a clear action, which is performed after all test cases of the test suite end.
46            // This API supports only one parameter: clear action function.
47            hilog.info(0x0000, 'testTag', '%{public}s', 'webgl1_test_01 end');
48        })
49
50        let VERTEX_SOURCE_DEMO = `
51            attribute vec4 a_Position;
52            attribute float a_PointSize;
53            void main(){
54                gl_Position = a_Position;
55                gl_PointSize = a_PointSize;
56            }
57        `;
58        let FRAGMENT_SOURCE_DEMO = `
59            precision mediump float;
60            uniform vec4 u_FragColor;
61            void main(){
62                gl_FragColor = u_FragColor;
63            }
64        `;
65        let initShader = (gl, type, source) => {
66            let shader = gl.createShader(type); // 创建顶点着色器
67            if (shader == null) {
68                console.log('unable to create shader');
69                return null;
70            }
71            gl.shaderSource(shader, source); // 设置着色器代码
72            gl.compileShader(shader); // 编译
73            let shaderParameter = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
74            if (!shaderParameter) { // 如果编译失败
75                let error = gl.getShaderInfoLog(shader);
76                console.log('failed to compile shader: ' + error);
77                gl.deleteShader(shader); // 删除着色器
78                return null;
79            }
80            return shader;
81        }
82
83        /**
84         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0001
85         * @tc.name webgl_test_createProgram
86         * @tc.desc Test createProgram.
87         */
88        it('webgl_test_createProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
89            console.info("webgltest [webgl_test_createProgram] createProgram");
90            let program = gl.createProgram();
91            console.info("webgltest program:", program);
92            expect(program != null).assertTrue();
93            console.log("webgltest isProgram:", gl.isProgram(program));
94            expect(gl.isProgram(program)).assertEqual(true);
95            console.log("webgltest delete program");
96            gl.deleteProgram(program)
97            console.log("webgltest isProgram:", gl.isProgram(program));
98            expect(gl.isProgram(program)).assertEqual(false);
99            checkError(gl);
100            done();
101        })
102
103        function deleteProgram(callback, finish) {
104            let program = gl.createProgram();
105            expect(program != null).assertTrue();
106            callback(program);
107            finish(gl.isProgram(program));
108        }
109
110
111        /**
112         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0002
113         * @tc.name webgl_test_deleteProgram
114         * @tc.desc Test deleteProgram.
115         */
116        it('webgl_test_deleteProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
117            console.info("webgltest [webgl_test_deleteProgram] deleteProgram");
118            let program = gl.createProgram();
119            console.info("webgltest program:", program);
120            expect(program != null).assertTrue();
121            console.log("webgltest isProgram:", gl.isProgram(program));
122            expect(gl.isProgram(program)).assertEqual(true);
123            console.log("webgltest delete program");
124            gl.deleteProgram(program)
125            console.log("webgltest isProgram:", gl.isProgram(program));
126            expect(gl.isProgram(program)).assertEqual(false);
127            checkError(gl);
128            done();
129        })
130
131
132        /**
133         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0003
134         * @tc.name webgl_test_deleteProgram_1
135         * @tc.desc Test deleteProgram.
136         */
137        it('webgl_test_deleteProgram_1', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
138            console.info("webgltest [webgl_test_deleteProgram_1] deleteProgram");
139            deleteProgram((program) => {
140                gl.deleteProgram(null);
141                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
142            }, () => {
143                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
144            })
145            done();
146        })
147
148
149        /**
150         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0004
151         * @tc.name webgl_test_deleteProgram_2
152         * @tc.desc Test deleteProgram.
153         */
154        it('webgl_test_deleteProgram_2', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
155            console.info("webgltest [webgl_test_deleteProgram_2] deleteProgram");
156            deleteProgram((program) => {
157                gl.deleteProgram(undefined);
158                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
159            }, () => {
160                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
161            })
162            done();
163        })
164
165        function isProgram(callback, finish) {
166            let program = gl.createProgram();
167            callback(program);
168            gl.deleteProgram(program)
169            finish(gl.isProgram(program));
170        }
171
172
173        /**
174         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0005
175         * @tc.name webgl_test_isProgram
176         * @tc.desc Test isProgram.
177         */
178        it('webgl_test_isProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
179            console.info("webgltest [webgl_test_isProgram] isProgram");
180            let program = gl.createProgram();
181            console.log("webgltest isProgram:", gl.isProgram(program));
182            expect(gl.isProgram(program)).assertEqual(true);
183            console.log("webgltest delete program");
184            gl.deleteProgram(program)
185            console.log("webgltest isProgram:", gl.isProgram(program));
186            expect(gl.isProgram(program)).assertEqual(false);
187            checkError(gl);
188            done();
189        })
190
191
192        /**
193         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0006
194         * @tc.name webgl_test_isProgram_1
195         * @tc.desc Test isProgram.
196         */
197        it('webgl_test_isProgram_1', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
198            console.info("webgltest [webgl_test_isProgram_1] isProgram");
199            isProgram((program) => {
200                gl.isProgram(null);
201                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
202            }, () => {
203                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
204            })
205            done();
206        })
207
208
209        /**
210         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0007
211         * @tc.name webgl_test_isProgram_2
212         * @tc.desc Test isProgram.
213         */
214        it('webgl_test_isProgram_2', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
215            console.info("webgltest [webgl_test_isProgram_2] isProgram");
216            isProgram((program) => {
217                gl.isProgram(undefined);
218                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
219            }, () => {
220                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
221            })
222            done();
223        })
224
225        /**
226         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0008
227         * @tc.name webgl_test_linkProgram
228         * @tc.desc Test linkProgram.
229         */
230        it('webgl_test_linkProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
231            console.info("webgltest [webgl_test_linkProgram] linkProgram");
232            let program = gl.createProgram();
233            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
234            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
235            gl.attachShader(program, vShader);
236            gl.attachShader(program, fShader);
237            console.info("webgl test LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
238            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertEqual(false);
239            console.info("webgl test linkProgram..");
240            gl.linkProgram(program);
241            console.info("webgl test LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
242            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertEqual(true);
243            gl.deleteShader(vShader);
244            gl.deleteShader(fShader);
245            gl.deleteProgram(program);
246            checkError(gl);
247            done();
248        })
249
250        function getProgramParameter(callback, finish) {
251            let program = gl.createProgram();
252            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
253            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
254            gl.attachShader(program, vShader);
255            gl.attachShader(program, fShader);
256            callback(program)
257            finish()
258            gl.deleteShader(vShader);
259            gl.deleteShader(fShader);
260            gl.deleteProgram(program);
261        }
262
263
264        /**
265         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0009
266         * @tc.name webgl_test_getProgramParameter
267         * @tc.desc Test getProgramParameter.
268         */
269        it('webgl_test_getProgramParameter', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0,
270            async function (done) {
271            console.info("webgltest [webgl_test_getProgramParameter] getProgramParameter");
272            let program = gl.createProgram();
273            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
274            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
275            gl.attachShader(program, vShader);
276            gl.attachShader(program, fShader);
277            console.info("webgltest LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
278            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertEqual(false);
279            console.info("webgltest gl.linkProgram(program);");
280            gl.linkProgram(program);
281            console.info("webgltest LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
282            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertTrue();
283            console.info("webgl test DELETE_STATUS:", gl.getProgramParameter(program, gl.DELETE_STATUS));
284            expect(gl.getProgramParameter(program, gl.DELETE_STATUS)).assertEqual(false);
285            console.info("webgl test ATTACHED_SHADERS:", gl.getProgramParameter(program, gl.ATTACHED_SHADERS));
286            expect(gl.getProgramParameter(program, gl.ATTACHED_SHADERS)).assertEqual(2);
287            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(false);
288            gl.validateProgram(program);
289            console.info("webgl test VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
290            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(true);
291            gl.deleteShader(vShader);
292            gl.deleteShader(fShader);
293            gl.deleteProgram(program);
294            checkError(gl);
295            done();
296        })
297
298
299        /**
300         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0010
301         * @tc.name webgl_test_getProgramParameter_1
302         * @tc.desc Test getProgramParameter.
303         */
304        it('webgl_test_getProgramParameter_1', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0,
305            async function (done) {
306            console.info("webgltest [webgl_test_getProgramParameter_1] getProgramParameter");
307            getProgramParameter((program) => {
308                gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)
309            }, () => {
310                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
311            })
312            done();
313        })
314
315        /**
316         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0011
317         * @tc.name webgl_test_validateProgram
318         * @tc.desc Test validateProgram.
319         */
320        it('webgl_test_validateProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
321            console.info("webgltest [webgl_test_validateProgram] validateProgram");
322            let program = gl.createProgram();
323            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
324            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
325            gl.attachShader(program, vShader);
326            gl.attachShader(program, fShader);
327            gl.linkProgram(program);
328            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(false);
329            console.info("webgltest VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
330            console.info("webgltest gl.validateProgram(program);");
331            gl.validateProgram(program);
332            console.info("webgltest VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
333            let err = checkError(gl);
334            expect(err).assertEqual(gl.NO_ERROR);
335            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(true);
336            gl.deleteShader(vShader);
337            gl.deleteShader(fShader);
338            gl.deleteProgram(program);
339            checkError(gl);
340            done();
341        })
342
343        function useProgram(callback, finish) {
344            let program = gl.createProgram();
345            let program2 = gl.createProgram();
346            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
347            let vShader2 = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
348            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
349            let fShader2 = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
350            gl.attachShader(program, vShader);
351            gl.attachShader(program, fShader);
352            gl.attachShader(program2, vShader2);
353            gl.attachShader(program2, fShader2);
354            gl.linkProgram(program);
355            gl.linkProgram(program2);
356            gl.validateProgram(program);
357            gl.validateProgram(program2);
358            callback(program)
359            finish()
360            gl.deleteShader(vShader);
361            gl.deleteShader(vShader2);
362            gl.deleteShader(fShader);
363            gl.deleteShader(fShader2);
364            gl.deleteProgram(program);
365            gl.deleteProgram(program2);
366        }
367
368
369        /**
370         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0012
371         * @tc.name webgl_test_useProgram
372         * @tc.desc Test useProgram.
373         */
374        it('webgl_test_useProgram', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
375            console.info("webgltest [webgl_test_useProgram] useProgram");
376            let program = gl.createProgram();
377            let program2 = gl.createProgram();
378            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
379            let vShader2 = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
380            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
381            let fShader2 = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
382            gl.attachShader(program, vShader);
383            gl.attachShader(program, fShader);
384            gl.attachShader(program2, vShader2);
385            gl.attachShader(program2, fShader2);
386            gl.linkProgram(program);
387            gl.linkProgram(program2);
388            gl.validateProgram(program);
389            gl.validateProgram(program2);
390            console.info("webgltest VERSION:", gl.getParameter(gl.VERSION));
391            console.info("webgltest VENDOR:", gl.getParameter(gl.VENDOR));
392            gl.useProgram(program);
393            console.info("webgltest CURRENT_PROGRAM:", gl.getParameter(gl.CURRENT_PROGRAM));
394            expect(gl.getParameter(gl.CURRENT_PROGRAM)).assertEqual(program);
395            gl.useProgram(program2);
396            console.info("webgltest CURRENT_PROGRAM:", gl.getParameter(gl.CURRENT_PROGRAM));
397            expect(gl.getParameter(gl.CURRENT_PROGRAM)).assertEqual(program2);
398            gl.deleteShader(vShader);
399            gl.deleteShader(vShader2);
400            gl.deleteShader(fShader);
401            gl.deleteShader(fShader2);
402            gl.deleteProgram(program);
403            gl.deleteProgram(program2);
404            checkError(gl);
405            done();
406        })
407
408
409        /**
410         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0013
411         * @tc.name webgl_test_useProgram_1
412         * @tc.desc Test useProgram.
413         */
414        it('webgl_test_useProgram_1', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
415            console.info("webgltest [webgl_test_useProgram_1] useProgram");
416            getProgramParameter((program) => {
417                gl.useProgram(null);
418            }, () => {
419                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
420            })
421            done();
422        })
423
424
425        /**
426         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0014
427         * @tc.name webgl_test_useProgram_2
428         * @tc.desc Test useProgram.
429         */
430        it('webgl_test_useProgram_2', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
431            console.info("webgltest [webgl_test_useProgram_2] useProgram");
432            getProgramParameter((program) => {
433                gl.useProgram(undefined);
434            }, () => {
435                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
436            })
437            done();
438        })
439
440        /**
441         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0015
442         * @tc.name webgl_test_getProgramInfoLog
443         * @tc.desc Test getProgramInfoLog.
444         */
445        it('webgl_test_getProgramInfoLog', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0, async function (done) {
446            console.info("webgltest [webgl_test_getProgramInfoLog] getProgramInfoLog");
447            let program = gl.createProgram();
448            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
449            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
450            gl.attachShader(program, vShader);
451            gl.attachShader(program, fShader);
452            gl.linkProgram(program);
453            gl.validateProgram(program);
454            console.info("webgltest getProgramInfoLog:", gl.getProgramInfoLog(program));
455            expect(checkError(gl)).assertEqual(gl.NO_ERROR);
456            expect(gl.getProgramInfoLog(program)).assertEqual("");
457            gl.deleteShader(vShader);
458            gl.deleteShader(fShader);
459            gl.deleteProgram(program);
460            checkError(gl);
461            done();
462        })
463
464
465        /**
466         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0016
467         * @tc.name webgl_test_getProgramInfoLog_2
468         * @tc.desc Test getProgramInfoLog.
469         */
470        it('webgl_test_getProgramInfoLog_2', TestType.FUNCTION | Size.MEDIUMTEST | Level.LEVEL0,
471            async function (done) {
472            console.info("webgltest [webgl_test_getProgramInfoLog] getProgramInfoLog");
473            let program = gl.createProgram();
474            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
475            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
476            gl.linkProgram(program);
477            gl.validateProgram(program);
478            gl.useProgram(program);
479            expect(checkError(gl)).assertEqual(gl.INVALID_OPERATION);
480            console.info("webgltest getProgramInfoLog:", gl.getProgramInfoLog(program));
481            expect(gl.getProgramInfoLog(program).length > 0).assertEqual(true);
482            gl.deleteShader(vShader);
483            gl.deleteShader(fShader);
484            gl.deleteProgram(program);
485            checkError(gl);
486            done();
487        })
488    })
489}
490