• 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 } 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', 0, 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', 0, 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', 0, 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', 0, 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', 0, 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', 0, 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', 0, 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', 0, 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', 0, async function (done) {
270            console.info("webgltest [webgl_test_getProgramParameter] getProgramParameter");
271            let program = gl.createProgram();
272            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
273            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
274            gl.attachShader(program, vShader);
275            gl.attachShader(program, fShader);
276            console.info("webgltest LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
277            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertEqual(false);
278            console.info("webgltest gl.linkProgram(program);");
279            gl.linkProgram(program);
280            console.info("webgltest LINK_STATUS:", gl.getProgramParameter(program, gl.LINK_STATUS));
281            expect(gl.getProgramParameter(program, gl.LINK_STATUS)).assertTrue();
282            console.info("webgl test DELETE_STATUS:", gl.getProgramParameter(program, gl.DELETE_STATUS));
283            expect(gl.getProgramParameter(program, gl.DELETE_STATUS)).assertEqual(false);
284            console.info("webgl test ATTACHED_SHADERS:", gl.getProgramParameter(program, gl.ATTACHED_SHADERS));
285            expect(gl.getProgramParameter(program, gl.ATTACHED_SHADERS)).assertEqual(2);
286            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(false);
287            gl.validateProgram(program);
288            console.info("webgl test VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
289            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(true);
290            gl.deleteShader(vShader);
291            gl.deleteShader(fShader);
292            gl.deleteProgram(program);
293            checkError(gl);
294            done();
295        })
296
297
298        /**
299         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0010
300         * @tc.name webgl_test_getProgramParameter_1
301         * @tc.desc Test getProgramParameter.
302         */
303        it('webgl_test_getProgramParameter_1', 0, async function (done) {
304            console.info("webgltest [webgl_test_getProgramParameter_1] getProgramParameter");
305            getProgramParameter((program) => {
306                gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)
307            }, () => {
308                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
309            })
310            done();
311        })
312
313        /**
314         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0011
315         * @tc.name webgl_test_validateProgram
316         * @tc.desc Test validateProgram.
317         */
318        it('webgl_test_validateProgram', 0, async function (done) {
319            console.info("webgltest [webgl_test_validateProgram] validateProgram");
320            let program = gl.createProgram();
321            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
322            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
323            gl.attachShader(program, vShader);
324            gl.attachShader(program, fShader);
325            gl.linkProgram(program);
326            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(false);
327            console.info("webgltest VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
328            console.info("webgltest gl.validateProgram(program);");
329            gl.validateProgram(program);
330            console.info("webgltest VALIDATE_STATUS:", gl.getProgramParameter(program, gl.VALIDATE_STATUS));
331            let err = checkError(gl);
332            expect(err).assertEqual(gl.NO_ERROR);
333            expect(gl.getProgramParameter(program, gl.VALIDATE_STATUS)).assertEqual(true);
334            gl.deleteShader(vShader);
335            gl.deleteShader(fShader);
336            gl.deleteProgram(program);
337            checkError(gl);
338            done();
339        })
340
341        function useProgram(callback, finish) {
342            let program = gl.createProgram();
343            let program2 = gl.createProgram();
344            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
345            let vShader2 = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
346            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
347            let fShader2 = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
348            gl.attachShader(program, vShader);
349            gl.attachShader(program, fShader);
350            gl.attachShader(program2, vShader2);
351            gl.attachShader(program2, fShader2);
352            gl.linkProgram(program);
353            gl.linkProgram(program2);
354            gl.validateProgram(program);
355            gl.validateProgram(program2);
356            callback(program)
357            finish()
358            gl.deleteShader(vShader);
359            gl.deleteShader(vShader2);
360            gl.deleteShader(fShader);
361            gl.deleteShader(fShader2);
362            gl.deleteProgram(program);
363            gl.deleteProgram(program2);
364        }
365
366
367        /**
368         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0012
369         * @tc.name webgl_test_useProgram
370         * @tc.desc Test useProgram.
371         */
372        it('webgl_test_useProgram', 0, async function (done) {
373            console.info("webgltest [webgl_test_useProgram] useProgram");
374            let program = gl.createProgram();
375            let program2 = gl.createProgram();
376            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
377            let vShader2 = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
378            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
379            let fShader2 = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
380            gl.attachShader(program, vShader);
381            gl.attachShader(program, fShader);
382            gl.attachShader(program2, vShader2);
383            gl.attachShader(program2, fShader2);
384            gl.linkProgram(program);
385            gl.linkProgram(program2);
386            gl.validateProgram(program);
387            gl.validateProgram(program2);
388            console.info("webgltest VERSION:", gl.getParameter(gl.VERSION));
389            console.info("webgltest VENDOR:", gl.getParameter(gl.VENDOR));
390            gl.useProgram(program);
391            console.info("webgltest CURRENT_PROGRAM:", gl.getParameter(gl.CURRENT_PROGRAM));
392            expect(gl.getParameter(gl.CURRENT_PROGRAM)).assertEqual(program);
393            gl.useProgram(program2);
394            console.info("webgltest CURRENT_PROGRAM:", gl.getParameter(gl.CURRENT_PROGRAM));
395            expect(gl.getParameter(gl.CURRENT_PROGRAM)).assertEqual(program2);
396            gl.deleteShader(vShader);
397            gl.deleteShader(vShader2);
398            gl.deleteShader(fShader);
399            gl.deleteShader(fShader2);
400            gl.deleteProgram(program);
401            gl.deleteProgram(program2);
402            checkError(gl);
403            done();
404        })
405
406
407        /**
408         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0013
409         * @tc.name webgl_test_useProgram_1
410         * @tc.desc Test useProgram.
411         */
412        it('webgl_test_useProgram_1', 0, async function (done) {
413            console.info("webgltest [webgl_test_useProgram_1] useProgram");
414            getProgramParameter((program) => {
415                gl.useProgram(null);
416            }, () => {
417                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
418            })
419            done();
420        })
421
422
423        /**
424         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0014
425         * @tc.name webgl_test_useProgram_2
426         * @tc.desc Test useProgram.
427         */
428        it('webgl_test_useProgram_2', 0, async function (done) {
429            console.info("webgltest [webgl_test_useProgram_2] useProgram");
430            getProgramParameter((program) => {
431                gl.useProgram(undefined);
432            }, () => {
433                expect(checkError(gl)).assertEqual(gl.NO_ERROR);
434            })
435            done();
436        })
437
438        /**
439         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0015
440         * @tc.name webgl_test_getProgramInfoLog
441         * @tc.desc Test getProgramInfoLog.
442         */
443        it('webgl_test_getProgramInfoLog', 0, async function (done) {
444            console.info("webgltest [webgl_test_getProgramInfoLog] getProgramInfoLog");
445            let program = gl.createProgram();
446            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
447            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
448            gl.attachShader(program, vShader);
449            gl.attachShader(program, fShader);
450            gl.linkProgram(program);
451            gl.validateProgram(program);
452            console.info("webgltest getProgramInfoLog:", gl.getProgramInfoLog(program));
453            expect(checkError(gl)).assertEqual(gl.NO_ERROR);
454            expect(gl.getProgramInfoLog(program)).assertEqual("");
455            gl.deleteShader(vShader);
456            gl.deleteShader(fShader);
457            gl.deleteProgram(program);
458            checkError(gl);
459            done();
460        })
461
462
463        /**
464         * @tc.number GRAPHIC_FUNCTION_JS_WEBGL_PROGRAM_0016
465         * @tc.name webgl_test_getProgramInfoLog_2
466         * @tc.desc Test getProgramInfoLog.
467         */
468        it('webgl_test_getProgramInfoLog_2', 0, async function (done) {
469            console.info("webgltest [webgl_test_getProgramInfoLog] getProgramInfoLog");
470            let program = gl.createProgram();
471            let vShader = initShader(gl, gl.VERTEX_SHADER, VERTEX_SOURCE_DEMO);
472            let fShader = initShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SOURCE_DEMO);
473            gl.linkProgram(program);
474            gl.validateProgram(program);
475            gl.useProgram(program);
476            expect(checkError(gl)).assertEqual(gl.INVALID_OPERATION);
477            console.info("webgltest getProgramInfoLog:", gl.getProgramInfoLog(program));
478            expect(gl.getProgramInfoLog(program).length > 0).assertEqual(true);
479            gl.deleteShader(vShader);
480            gl.deleteShader(fShader);
481            gl.deleteProgram(program);
482            checkError(gl);
483            done();
484        })
485    })
486}
487