blob: 20ee731e2ce0a9bae4c9e97d2e5b71d808c6e182 [file] [log] [blame]
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library web_gl_test;
import 'package:unittest/unittest.dart';
import 'package:unittest/html_individual_config.dart';
import 'dart:html';
import 'dart:typed_data';
import 'dart:web_gl';
import 'dart:web_gl' as gl;
// Test that various webgl extensions are available. Only test advertised
// supported extensions. If the extension has methods, we just test the presence
// of some methods - we don't test if functionality works.
main() {
useHtmlIndividualConfiguration();
if (!RenderingContext.supported) return;
const allExtensions = const [
'ANGLE_instanced_arrays',
'EXT_blend_minmax',
'EXT_color_buffer_float',
'EXT_color_buffer_half_float',
'EXT_disjoint_timer_query',
'EXT_frag_depth',
'EXT_sRGB',
'EXT_shader_texture_lod',
'EXT_texture_filter_anisotropic',
'OES_element_index_uint',
'OES_standard_derivatives',
'OES_texture_float',
'OES_texture_float_linear',
'OES_texture_half_float',
'OES_texture_half_float_linear',
'OES_vertex_array_object',
'WEBGL_color_buffer_float',
'WEBGL_compressed_texture_atc',
'WEBGL_compressed_texture_es3',
'WEBGL_compressed_texture_etc1',
'WEBGL_compressed_texture_pvrtc',
'WEBGL_compressed_texture_s3tc',
'WEBGL_debug_renderer_info',
'WEBGL_debug_shaders',
'WEBGL_depth_texture',
'WEBGL_draw_buffers',
'WEBGL_lose_context',
];
getExtension(String name) {
expect(name, isIn(allExtensions), reason: 'unknown extension');
var canvas = new CanvasElement();
var context = canvas.getContext3d();
var supportedExtensions = context.getSupportedExtensions();
if (supportedExtensions.contains(name)) {
var extension = context.getExtension(name);
expect(extension, isNotNull);
return extension;
}
return null;
}
testType(name, typeMatcher) {
test('type', () {
var extension = getExtension(name);
if (extension == null) return;
expect(extension, typeMatcher);
// Ensure that isInstanceOf<X> is not instantiated for an erroneous type
// X. If X is erroneous, there is only a warning at compile time and X is
// treated as dynamic, which would make the above line pass.
expect(1, isNot(typeMatcher), reason: 'invalid typeMatcher');
});
}
group('ANGLE_instanced_arrays', () {
const name = 'ANGLE_instanced_arrays';
testType(name, const isInstanceOf<AngleInstancedArrays>());
test('vertexAttribDivisorAngle', () {
var extension = getExtension(name);
if (extension == null) return;
expect(extension.vertexAttribDivisorAngle, isFunction);
});
});
group('EXT_blend_minmax', () {
testType('EXT_blend_minmax', const isInstanceOf<ExtBlendMinMax>());
});
group('EXT_frag_depth', () {
testType('EXT_frag_depth', const isInstanceOf<ExtFragDepth>());
});
group('EXT_sRGB', () {
testType('EXT_sRGB', const isInstanceOf<EXTsRgb>());
});
group('EXT_shader_texture_lod', () {
testType(
'EXT_shader_texture_lod', const isInstanceOf<ExtShaderTextureLod>());
});
group('EXT_texture_filter_anisotropic', () {
testType('EXT_texture_filter_anisotropic',
const isInstanceOf<ExtTextureFilterAnisotropic>());
});
group('OES_element_index_uint', () {
testType(
'OES_element_index_uint', const isInstanceOf<OesElementIndexUint>());
});
group('OES_standard_derivatives', () {
testType('OES_standard_derivatives',
const isInstanceOf<OesStandardDerivatives>());
});
group('OES_texture_float', () {
testType('OES_texture_float', const isInstanceOf<OesTextureFloat>());
});
group('OES_texture_float_linear', () {
testType('OES_texture_float_linear',
const isInstanceOf<OesTextureFloatLinear>());
});
group('OES_texture_half_float', () {
testType(
'OES_texture_half_float', const isInstanceOf<OesTextureHalfFloat>());
});
group('OES_texture_half_float_linear', () {
testType('OES_texture_half_float_linear',
const isInstanceOf<OesTextureHalfFloatLinear>());
});
group('OES_vertex_array_object', () {
testType(
'OES_vertex_array_object', const isInstanceOf<OesVertexArrayObject>());
});
group('WEBGL_compressed_texture_atc', () {
testType('WEBGL_compressed_texture_atc',
const isInstanceOf<CompressedTextureAtc>());
});
group('WEBGL_compressed_texture_etc1', () {
testType('WEBGL_compressed_texture_etc1',
const isInstanceOf<CompressedTextureETC1>());
});
group('WEBGL_compressed_texture_pvrtc', () {
testType('WEBGL_compressed_texture_pvrtc',
const isInstanceOf<CompressedTexturePvrtc>());
});
group('WEBGL_compressed_texture_s3tc', () {
testType('WEBGL_compressed_texture_s3tc',
const isInstanceOf<CompressedTextureS3TC>());
});
group('WEBGL_debug_renderer_info', () {
testType(
'WEBGL_debug_renderer_info', const isInstanceOf<DebugRendererInfo>());
});
group('WEBGL_debug_shaders', () {
testType('WEBGL_debug_shaders', const isInstanceOf<DebugShaders>());
});
group('WEBGL_depth_texture', () {
testType('WEBGL_depth_texture', const isInstanceOf<DepthTexture>());
});
group('WEBGL_draw_buffers', () {
const name = 'WEBGL_draw_buffers';
testType(name, const isInstanceOf<DrawBuffers>());
test('drawBuffersWebgl', () {
var extension = getExtension(name);
if (extension == null) return;
expect(extension.drawBuffersWebgl, isFunction);
});
});
group('WEBGL_lose_context', () {
const name = 'WEBGL_lose_context';
testType(name, const isInstanceOf<LoseContext>());
test('loseContext', () {
var extension = getExtension(name);
if (extension == null) return;
expect(extension.loseContext, isFunction);
});
});
}
Matcher isFunction = const isInstanceOf<Function>();