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