// Copyright (c) 2013, 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.

// @dart = 2.9

import 'dart:html';
import 'dart:typed_data';
import 'dart:web_gl';
import 'dart:web_gl' as gl;

import 'package:expect/minitest.dart';

// Test that WebGL is present in dart:web_gl API

final isRenderingContext = predicate((x) => x is RenderingContext);
final isContextAttributes = predicate((x) => x is Map);

main() {
  group('supported', () {
    test('supported', () {
      expect(RenderingContext.supported, isTrue);
    });
  });

  group('functional', () {
    test('unsupported fails', () {
      var canvas = new CanvasElement();
      var context = canvas.getContext3d();
      if (RenderingContext.supported) {
        expect(context, isNotNull);
        expect(context, isRenderingContext);
      } else {
        expect(context, isNull);
      }
    });

    if (RenderingContext.supported) {
      test('simple', () {
        var canvas = new CanvasElement();
        var context =
            canvas.getContext('experimental-webgl') as gl.RenderingContext;
        expect(context, isNotNull);
        var shader = context.createShader(gl.WebGL.VERTEX_SHADER);
        context.shaderSource(shader, 'void main() { }');
        context.compileShader(shader);
        var success =
            context.getShaderParameter(shader, gl.WebGL.COMPILE_STATUS);
        expect(success, isTrue);
      });

      test('getContext3d', () {
        var canvas = new CanvasElement();
        var context = canvas.getContext3d();
        expect(context, isNotNull);
        expect(context, isRenderingContext);

        context = canvas.getContext3d(depth: false);
        expect(context, isNotNull);
        expect(context, isRenderingContext);
      });

      test('texImage2D', () {
        var canvas = new CanvasElement();
        var context = canvas.getContext3d();
        var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
        context.texImage2D(1, 1, 1, 1, 10, 10, 1, 1, pixels);

        canvas = new CanvasElement();
        document.body.children.add(canvas);
        CanvasRenderingContext2D context2 = canvas.getContext('2d');
        context.texImage2D(
            1, 1, 1, 1, 10, context2.getImageData(10, 10, 10, 10));

        context.texImage2D(1, 1, 1, 1, 10, new ImageElement());
        context.texImage2D(1, 1, 1, 1, 10, new CanvasElement());
        context.texImage2D(1, 1, 1, 1, 10, new VideoElement());
      });

      test('texSubImage2D', () {
        var canvas = new CanvasElement();
        var context = canvas.getContext3d();
        var pixels = new Uint8List.fromList([0, 0, 3, 255, 0, 0, 0, 0, 0, 0]);
        context.texSubImage2D(1, 1, 1, 1, 1, 10, 10, 1, pixels);

        canvas = new CanvasElement();
        document.body.children.add(canvas);
        CanvasRenderingContext2D context2 = canvas.getContext('2d');
        context.texSubImage2D(
            1, 1, 1, 1, 1, 10, context2.getImageData(10, 10, 10, 10));

        context.texSubImage2D(1, 1, 1, 1, 1, 10, new ImageElement());
        context.texSubImage2D(1, 1, 1, 1, 1, 10, new CanvasElement());
        context.texSubImage2D(1, 1, 1, 1, 1, 10, new VideoElement());
      });

      test('getContextAttributes', () {
        var canvas = new CanvasElement();
        var context = canvas.getContext3d();
        var attributes = context.getContextAttributes();

        expect(attributes, isNotNull);
        expect(attributes, isContextAttributes);

        expect(attributes['alpha'], isBoolean);
        expect(attributes['antialias'], isBoolean);
        expect(attributes['depth'], isBoolean);
        expect(attributes['premultipliedAlpha'], isBoolean);
        expect(attributes['preserveDrawingBuffer'], isBoolean);
        expect(attributes['stencil'], isBoolean);
      });
    }
  });
}

final isBoolean = predicate((v) => v == true || v == false);
