/**
 * @licstart The following is the entire license notice for the
 * Javascript code in this page
 *
 * Copyright 2020 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @licend The above is the entire license notice for the
 * Javascript code in this page
 */
"use strict";

var _primitives = require("../../core/primitives.js");

var _writer = require("../../core/writer.js");

var _util = require("../../shared/util.js");

var _stream = require("../../core/stream.js");

describe("Writer", function () {
  describe("Incremental update", function () {
    it("should update a file with new objects", function (done) {
      const originalData = new Uint8Array();
      const newRefs = [{
        ref: _primitives.Ref.get(123, 0x2d),
        data: "abc\n"
      }, {
        ref: _primitives.Ref.get(456, 0x4e),
        data: "defg\n"
      }];
      const xrefInfo = {
        newRef: _primitives.Ref.get(789, 0),
        startXRef: 314,
        fileIds: ["id", ""],
        rootRef: null,
        infoRef: null,
        encrypt: null,
        filename: "foo.pdf",
        info: {}
      };
      let data = (0, _writer.incrementalUpdate)(originalData, xrefInfo, newRefs);
      data = (0, _util.bytesToString)(data);
      const expected = "\nabc\n" + "defg\n" + "789 0 obj\n" + "<< /Size 790 /Prev 314 /Type /XRef /Index [0 1 123 1 456 1 789 1] " + "/ID [(id) (\x01#Eg\x89\xab\xcd\xef\xfe\xdc\xba\x98vT2\x10)] " + "/W [1 1 2] /Length 16>> stream\n" + "\x00\x01\xff\xff" + "\x01\x01\x00\x2d" + "\x01\x05\x00\x4e" + "\x01\x0a\x00\x00\n" + "endstream\n" + "endobj\n" + "startxref\n" + "10\n" + "%%EOF\n";
      expect(data).toEqual(expected);
      done();
    });
  });
  describe("writeDict", function () {
    it("should write a Dict", function (done) {
      const dict = new _primitives.Dict(null);
      dict.set("A", _primitives.Name.get("B"));
      dict.set("B", _primitives.Ref.get(123, 456));
      dict.set("C", 789);
      dict.set("D", "hello world");
      dict.set("E", "(hello\\world)");
      dict.set("F", [1.23001, 4.50001, 6]);
      const gdict = new _primitives.Dict(null);
      gdict.set("H", 123.00001);
      const string = "a stream";
      const stream = new _stream.StringStream(string);
      stream.dict = new _primitives.Dict(null);
      stream.dict.set("Length", string.length);
      gdict.set("I", stream);
      dict.set("G", gdict);
      const buffer = [];
      (0, _writer.writeDict)(dict, buffer, null);
      const expected = "<< /A /B /B 123 456 R /C 789 /D (hello world) " + "/E (\\(hello\\\\world\\)) /F [1.23 4.5 6] " + "/G << /H 123 /I << /Length 8>> stream\n" + "a stream\n" + "endstream\n>>>>";
      expect(buffer.join("")).toEqual(expected);
      done();
    });
  });
});