import { BoundingRectangle } from "../../Source/Cesium.js";
import { Color } from "../../Source/Cesium.js";
import { ClearCommand } from "../../Source/Cesium.js";
import { Framebuffer } from "../../Source/Cesium.js";
import { RenderState } from "../../Source/Cesium.js";
import { Texture } from "../../Source/Cesium.js";
import createContext from "../createContext.js";

describe(
  "Renderer/Clear",
  function () {
    var context;

    beforeAll(function () {
      context = createContext();
    });

    afterAll(function () {
      context.destroyForSpecs();
    });

    it("default clear", function () {
      ClearCommand.ALL.execute(context);
      expect(context).toReadPixels([0, 0, 0, 255]);
    });

    it("clears to white", function () {
      ClearCommand.ALL.execute(context);
      expect(context).toReadPixels([0, 0, 0, 255]);

      var command = new ClearCommand({
        color: Color.WHITE,
      });
      command.execute(context);
      expect(context).toReadPixels([255, 255, 255, 255]);
    });

    it("clears with a color mask", function () {
      ClearCommand.ALL.execute(context);
      expect(context).toReadPixels([0, 0, 0, 255]);

      var command = new ClearCommand({
        color: Color.WHITE,
        renderState: RenderState.fromCache({
          colorMask: {
            red: true,
            green: false,
            blue: true,
            alpha: true,
          },
        }),
      });
      command.execute(context);
      expect(context).toReadPixels([255, 0, 255, 255]);
    });

    it("clears with scissor test", function () {
      var command = new ClearCommand({
        color: Color.WHITE,
      });

      command.execute(context);
      expect(context).toReadPixels([255, 255, 255, 255]);

      command.color = Color.BLACK;
      command.renderState = RenderState.fromCache({
        scissorTest: {
          enabled: true,
          rectangle: new BoundingRectangle(),
        },
      });

      command.execute(context);
      expect(context).toReadPixels([255, 255, 255, 255]);

      command.renderState = RenderState.fromCache({
        scissorTest: {
          enabled: true,
          rectangle: new BoundingRectangle(0, 0, 1, 1),
        },
      });

      command.execute(context);
      expect(context).toReadPixels([0, 0, 0, 255]);
    });

    it("clears a framebuffer color attachment", function () {
      var colorTexture = new Texture({
        context: context,
        width: 1,
        height: 1,
      });
      var framebuffer = new Framebuffer({
        context: context,
        colorTextures: [colorTexture],
      });

      var command = new ClearCommand({
        color: new Color(0.0, 1.0, 0.0, 1.0),
        framebuffer: framebuffer,
      });
      command.execute(context);

      expect({
        context: context,
        framebuffer: framebuffer,
      }).toReadPixels([0, 255, 0, 255]);

      framebuffer = framebuffer.destroy();
    });

    it("fails to read pixels (width)", function () {
      expect(function () {
        expect(
          context.readPixels({
            width: -1,
          })
        ).toEqual([0, 0, 0, 0]);
      }).toThrowDeveloperError();
    });

    it("fails to read pixels (height)", function () {
      expect(function () {
        expect(
          context.readPixels({
            height: -1,
          })
        ).toEqual([0, 0, 0, 0]);
      }).toThrowDeveloperError();
    });
  },
  "WebGL"
);