import { ContextLimits } from "../../Source/Cesium.js";
import { Renderbuffer } from "../../Source/Cesium.js";
import { RenderbufferFormat } from "../../Source/Cesium.js";
import createContext from "../createContext.js";

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

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

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

    afterEach(function () {
      renderbuffer = renderbuffer && renderbuffer.destroy();
    });

    it("creates", function () {
      renderbuffer = new Renderbuffer({
        context: context,
        format: RenderbufferFormat.DEPTH_COMPONENT16,
        width: 64,
        height: 32,
      });

      expect(renderbuffer.format).toEqual(RenderbufferFormat.DEPTH_COMPONENT16);
      expect(renderbuffer.width).toEqual(64);
      expect(renderbuffer.height).toEqual(32);
    });

    it("creates with defaults", function () {
      renderbuffer = new Renderbuffer({
        context: context,
      });

      expect(renderbuffer.format).toEqual(RenderbufferFormat.RGBA4);
      expect(renderbuffer.width).toEqual(context.canvas.clientWidth);
      expect(renderbuffer.height).toEqual(context.canvas.clientHeight);
    });

    it("destroys", function () {
      var r = new Renderbuffer({
        context: context,
      });
      expect(r.isDestroyed()).toEqual(false);
      r.destroy();
      expect(r.isDestroyed()).toEqual(true);
    });

    it("throws when created with invalid format", function () {
      expect(function () {
        renderbuffer = new Renderbuffer({
          context: context,
          format: "invalid format",
        });
      }).toThrowDeveloperError();
    });

    it("throws when created with small width", function () {
      expect(function () {
        renderbuffer = new Renderbuffer({
          context: context,
          width: 0,
        });
      }).toThrowDeveloperError();
    });

    it("throws when created with large width", function () {
      expect(function () {
        renderbuffer = new Renderbuffer({
          context: context,
          width: ContextLimits.maximumRenderbufferSize + 1,
        });
      }).toThrowDeveloperError();
    });

    it("throws when created with small height", function () {
      expect(function () {
        renderbuffer = new Renderbuffer({
          context: context,
          height: 0,
        });
      }).toThrowDeveloperError();
    });

    it("throws when created with large height", function () {
      expect(function () {
        renderbuffer = new Renderbuffer({
          context: context,
          height: ContextLimits.maximumRenderbufferSize + 1,
        });
      }).toThrowDeveloperError();
    });

    it("throws when fails to destroy", function () {
      var r = new Renderbuffer({
        context: context,
      });
      r.destroy();

      expect(function () {
        r.destroy();
      }).toThrowDeveloperError();
    });

    it("throws when there is no context", function () {
      expect(function () {
        return new Renderbuffer();
      }).toThrowDeveloperError();
    });
  },
  "WebGL"
);
