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