smartfile/test/test.js

189 lines
31 KiB
JavaScript

"use strict";
require("typings-test");
var smartfile = require("../dist/index.js");
var beautylog = require("beautylog");
var gulp = require("gulp");
var gFunction = require("gulp-function");
var should = require("should");
var vinyl = require("vinyl");
describe("smartfile".yellow, function () {
describe(".checks".yellow, function () {
describe(".fileExistsSync".yellow, function () {
it("should return an accurate boolean", function () {
(smartfile.checks.fileExistsSync("./test/mytest.json")).should.be.true();
(smartfile.checks.fileExistsSync("./test/notthere.json")).should.be.false();
});
});
describe(".fileExists".yellow, function () {
it("should return a working promise", function () {
(smartfile.checks.fileExists("./test/mytest.json")).should.be.Promise();
(smartfile.checks.fileExists("./test/mytest.json")).should.be.fulfilled();
(smartfile.checks.fileExists("./test/notthere.json")).should.not.be.fulfilled();
});
});
});
describe(".fsaction".yellow, function () {
describe(".copy()".yellow, function () {
it("should copy a directory", function () {
smartfile.fsaction.copy("./test/testfolder/", "./test/temp/");
});
it("should copy a file", function () {
smartfile.fsaction.copy("./test/mytest.yaml", "./test/temp/");
});
it("should copy a file and rename it", function () {
smartfile.fsaction.copy("./test/mytest.yaml", "./test/temp/mytestRenamed.yaml");
});
});
describe(".remove()", function () {
it("should remove an entire directory", function () {
});
it("should remove single files", function () {
});
});
});
describe(".get", function () {
describe(".filetype()", function () {
it("should get the file type from a string", function () {
smartfile.get.filetype("./somefolder/data.json").should.equal("json");
});
});
describe(".foldersSync()", function () {
it("should get the file type from a string", function () {
smartfile.get.foldersSync("./test/").should.containDeep(["testfolder"]);
smartfile.get.foldersSync("./test/").should.not.containDeep(["notExistentFolder"]);
});
});
describe(".folders()", function () {
it("should get the file type from a string", function (done) {
smartfile.get.folders("./test/")
.then(function (folderArrayArg) {
folderArrayArg.should.containDeep(["testfolder"]);
folderArrayArg.should.not.containDeep(["notExistentFolder"]);
done();
});
});
});
});
describe(".local".yellow, function () {
describe("toGulpStreamSync() and toGulpDestSync", function () {
it("should produce a gulp stream", function (done) {
smartfile.local.toGulpStreamSync("./test/my*")
.pipe(smartfile.local.toGulpDestSync("./test/temp/"))
.pipe(gFunction(done, "atEnd"));
});
});
describe(".toObjectSync()".yellow, function () {
it("should read an " + ".yaml".blue + " file to an object", function () {
var testData = smartfile.local.toObjectSync("./test/mytest.yaml");
testData.should.have.property("key1", "this works");
testData.should.have.property("key2", "this works too");
});
it("should state unknown file type for unknown file types", function () {
var testData = smartfile.local.toObjectSync("./test/mytest.txt");
});
it("should read an " + ".json".blue + " file to an object", function () {
var testData = smartfile.local.toObjectSync("./test/mytest.json");
testData.should.have.property("key1", "this works");
testData.should.have.property("key2", "this works too");
});
});
describe(".toStringSync()".yellow, function () {
it("should read a file to a string", function () {
should.equal(smartfile.local.toStringSync("./test/mytest.txt"), "Some TestString &&%$");
});
});
describe(".toVinylSync".yellow, function () {
it("should read an " + ".json OR .yaml".blue + " file to an " + "vinyl file object".cyan, function () {
var testData = smartfile.local.toVinylSync("./test/mytest.json");
(vinyl.isVinyl(testData)).should.be.true();
});
});
});
describe(".memory", function () {
describe(".toGulpStream()", function () {
it("should produce a valid gulp stream", function () {
var localArray = ["test1", "test2", "test3"];
smartfile.memory.toGulpStream(localArray)
.pipe(gulp.dest("./test/temp/"));
});
});
describe("toVinylFileSync()", function () {
it("should produce a vinylFile", function () {
var localString = "myString";
var localOptions = { filename: "vinylfile2", base: "/someDir" };
(smartfile.memory.toVinylFileSync(localString, localOptions) instanceof vinyl).should.be.true();
});
});
describe("toVinylArraySync()", function () {
it("should produce a an array of vinylfiles", function () {
var localStringArray = ["string1", "string2", "string3"];
var localOptions = { filename: "vinylfile2", base: "/someDir" };
var testResult = smartfile.memory.toVinylArraySync(localStringArray, localOptions);
testResult.should.be.Array();
(testResult.length === 3).should.be.true();
for (var myKey in testResult) {
(testResult[myKey] instanceof vinyl).should.be.true();
}
});
});
describe("toStringSync()", function () {
it("should produce a String from vinyl file", function () {
var localString = smartfile.memory.toStringSync(new vinyl({
base: "/",
path: "/test.txt",
contents: new Buffer("myString")
}));
localString.should.equal("myString");
});
});
describe("toFs()", function () {
it("should write a file to disk and return a promise", function (done) {
var localString = "myString";
smartfile.memory.toFs(localString, {
fileName: "./test/temp/testMemToFs.txt",
filePath: process.cwd()
}).then(done);
});
});
describe("toFsSync()", function () {
it("should write a file to disk and return true if successfull", function () {
var localString = "myString";
smartfile.memory.toFsSync(localString, {
fileName: "./test/temp/testMemToFsSync.txt",
filePath: process.cwd()
});
});
});
});
describe(".remote", function () {
describe("toGulpStreamSync()", function () {
it("should produce a gulp stream", function (done) {
smartfile.remote.toGulpStreamSync("mytest.txt", "https://raw.githubusercontent.com/pushrocks/smartfile/master/test/")
.pipe(smartfile.local.toGulpDestSync("./test/temp/"))
.pipe(gFunction(done, "atEnd"));
});
});
describe(".toString()", function () {
it("should load a remote file to a variable", function (done) {
this.timeout(5000);
smartfile.remote.toString("https://raw.githubusercontent.com/pushrocks/smartfile/master/test/mytest.txt")
.then(function (responseString) {
should.equal(responseString, "Some TestString &&%$");
done();
});
});
it("should reject a Promise when the link is false", function (done) {
this.timeout(10000);
smartfile.remote.toString("https://push.rocks/doesnotexist.txt")
.then(function () {
throw new Error("this test should not be resolved");
}, function () {
done();
});
});
});
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XHJcbmltcG9ydCAqIGFzIHNtYXJ0ZmlsZSBmcm9tIFwiLi4vZGlzdC9pbmRleC5qc1wiO1xyXG5sZXQgYmVhdXR5bG9nID0gcmVxdWlyZShcImJlYXV0eWxvZ1wiKTtcclxubGV0IGd1bHAgPSByZXF1aXJlKFwiZ3VscFwiKTtcclxubGV0IGdGdW5jdGlvbiA9IHJlcXVpcmUoXCJndWxwLWZ1bmN0aW9uXCIpO1xyXG5pbXBvcnQgc2hvdWxkID0gcmVxdWlyZShcInNob3VsZFwiKTtcclxubGV0IHZpbnlsID0gcmVxdWlyZShcInZpbnlsXCIpO1xyXG5cclxuZGVzY3JpYmUoXCJzbWFydGZpbGVcIi55ZWxsb3csZnVuY3Rpb24oKXtcclxuICAgIGRlc2NyaWJlKFwiLmNoZWNrc1wiLnllbGxvdyxmdW5jdGlvbigpe1xyXG4gICAgICAgIGRlc2NyaWJlKFwiLmZpbGVFeGlzdHNTeW5jXCIueWVsbG93LGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIHJldHVybiBhbiBhY2N1cmF0ZSBib29sZWFuXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIChzbWFydGZpbGUuY2hlY2tzLmZpbGVFeGlzdHNTeW5jKFwiLi90ZXN0L215dGVzdC5qc29uXCIpKS5zaG91bGQuYmUudHJ1ZSgpO1xyXG4gICAgICAgICAgICAgICAgKHNtYXJ0ZmlsZS5jaGVja3MuZmlsZUV4aXN0c1N5bmMoXCIuL3Rlc3Qvbm90dGhlcmUuanNvblwiKSkuc2hvdWxkLmJlLmZhbHNlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NyaWJlKFwiLmZpbGVFeGlzdHNcIi55ZWxsb3csZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcmV0dXJuIGEgd29ya2luZyBwcm9taXNlXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIChzbWFydGZpbGUuY2hlY2tzLmZpbGVFeGlzdHMoXCIuL3Rlc3QvbXl0ZXN0Lmpzb25cIikpLnNob3VsZC5iZS5Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAoc21hcnRmaWxlLmNoZWNrcy5maWxlRXhpc3RzKFwiLi90ZXN0L215dGVzdC5qc29uXCIpKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XHJcbiAgICAgICAgICAgICAgICAoc21hcnRmaWxlLmNoZWNrcy5maWxlRXhpc3RzKFwiLi90ZXN0L25vdHRoZXJlLmpzb25cIikpLnNob3VsZC5ub3QuYmUuZnVsZmlsbGVkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgZGVzY3JpYmUoXCIuZnNhY3Rpb25cIi55ZWxsb3csZnVuY3Rpb24oKXtcclxuICAgICAgICBkZXNjcmliZShcIi5jb3B5KClcIi55ZWxsb3csZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgY29weSBhIGRpcmVjdG9yeVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUuZnNhY3Rpb24uY29weShcIi4vdGVzdC90ZXN0Zm9sZGVyL1wiLFwiLi90ZXN0L3RlbXAvXCIpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCBjb3B5IGEgZmlsZVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUuZnNhY3Rpb24uY29weShcIi4vdGVzdC9teXRlc3QueWFtbFwiLFwiLi90ZXN0L3RlbXAvXCIpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCBjb3B5IGEgZmlsZSBhbmQgcmVuYW1lIGl0XCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIHNtYXJ0ZmlsZS5mc2FjdGlvbi5jb3B5KFwiLi90ZXN0L215dGVzdC55YW1sXCIsXCIuL3Rlc3QvdGVtcC9teXRlc3RSZW5hbWVkLnlhbWxcIilcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIucmVtb3ZlKClcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCByZW1vdmUgYW4gZW50aXJlIGRpcmVjdG9yeVwiLGZ1bmN0aW9uKCl7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcmVtb3ZlIHNpbmdsZSBmaWxlc1wiLGZ1bmN0aW9uKCl7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKFwiLmdldFwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIuZmlsZXR5cGUoKVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIGdldCB0aGUgZmlsZSB0eXBlIGZyb20gYSBzdHJpbmdcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLmdldC5maWxldHlwZShcIi4vc29tZWZvbGRlci9kYXRhLmpzb25cIikuc2hvdWxkLmVxdWFsKFwianNvblwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIuZm9sZGVyc1N5bmMoKVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIGdldCB0aGUgZmlsZSB0eXBlIGZyb20gYSBzdHJpbmdcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLmdldC5mb2xkZXJzU3luYyhcIi4vdGVzdC9cIikuc2hvdWxkLmNvbnRhaW5EZWVwKFsgXCJ0ZXN0Zm9sZGVyXCJdKTtcclxuICAgICAgICAgICAgICAgIHNtYXJ0ZmlsZS5nZXQuZm9sZGVyc1N5bmMoXCIuL3Rlc3QvXCIpLnNob3VsZC5ub3QuY29udGFpbkRlZXAoWyBcIm5vdEV4aXN0ZW50Rm9sZGVyXCJdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIuZm9sZGVycygpXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgZ2V0IHRoZSBmaWxlIHR5cGUgZnJvbSBhIHN0cmluZ1wiLGZ1bmN0aW9uKGRvbmUpe1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLmdldC5mb2xkZXJzKFwiLi90ZXN0L1wiKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGZvbGRlckFycmF5QXJnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyQXJyYXlBcmcuc2hvdWxkLmNvbnRhaW5EZWVwKFsgXCJ0ZXN0Zm9sZGVyXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyQXJyYXlBcmcuc2hvdWxkLm5vdC5jb250YWluRGVlcChbIFwibm90RXhpc3RlbnRGb2xkZXJcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGRlc2NyaWJlKFwiLmxvY2FsXCIueWVsbG93LGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZGVzY3JpYmUoXCJ0b0d1bHBTdHJlYW1TeW5jKCkgYW5kIHRvR3VscERlc3RTeW5jXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcHJvZHVjZSBhIGd1bHAgc3RyZWFtXCIsZnVuY3Rpb24oZG9uZSl7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUubG9jYWwudG9HdWxwU3RyZWFtU3luYyhcIi4vdGVzdC9teSpcIilcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShzbWFydGZpbGUubG9jYWwudG9HdWxwRGVzdFN5bmMoXCIuL3Rlc3QvdGVtcC9cIikpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZ0Z1bmN0aW9uKGRvbmUsXCJhdEVuZFwiKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NyaWJlKFwiLnRvT2JqZWN0U3luYygpXCIueWVsbG93LGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIHJlYWQgYW4gXCIgKyBcIi55YW1sXCIuYmx1ZSArIFwiIGZpbGUgdG8gYW4gb2JqZWN0XCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXN0RGF0YSA9IHNtYXJ0ZmlsZS5sb2NhbC50b09iamVjdFN5bmMoXCIuL3Rlc3QvbXl0ZXN0LnlhbWxcIik7XHJcbiAgICAgICAgICAgICAgICB0ZXN0RGF0YS5zaG91bGQuaGF2ZS5wcm9wZXJ0eShcImtleTFcIixcInRoaXMgd29ya3NcIik7XHJcbiAgICAgICAgICAgICAgICB0ZXN0RGF0YS5zaG91bGQuaGF2ZS5wcm9wZXJ0eShcImtleTJcIixcInRoaXMgd29ya3MgdG9vXCIpO1xyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIHN0YXRlIHVua25vd24gZmlsZSB0eXBlIGZvciB1bmtub3duIGZpbGUgdHlwZXNcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlc3REYXRhID0gc21hcnRmaWxlLmxvY2FsLnRvT2JqZWN0U3luYyhcIi4vdGVzdC9teXRlc3QudHh0XCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcmVhZCBhbiBcIiArIFwiLmpzb25cIi5ibHVlICsgXCIgZmlsZSB0byBhbiBvYmplY3RcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlc3REYXRhID0gc21hcnRmaWxlLmxvY2FsLnRvT2JqZWN0U3luYyhcIi4vdGVzdC9teXRlc3QuanNvblwiKTtcclxuICAgICAgICAgICAgICAgIHRlc3REYXRhLnNob3VsZC5oYXZlLnByb3BlcnR5KFwia2V5MVwiLFwidGhpcyB3b3Jrc1wiKTtcclxuICAgICAgICAgICAgICAgIHRlc3REYXRhLnNob3VsZC5oYXZlLnByb3BlcnR5KFwia2V5MlwiLFwidGhpcyB3b3JrcyB0b29cIik7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZXNjcmliZShcIi50b1N0cmluZ1N5bmMoKVwiLnllbGxvdyxmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCByZWFkIGEgZmlsZSB0byBhIHN0cmluZ1wiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBzaG91bGQuZXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgc21hcnRmaWxlLmxvY2FsLnRvU3RyaW5nU3luYyhcIi4vdGVzdC9teXRlc3QudHh0XCIpLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiU29tZSBUZXN0U3RyaW5nICYmJSRcIlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIudG9WaW55bFN5bmNcIi55ZWxsb3csZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcmVhZCBhbiBcIiArIFwiLmpzb24gT1IgLnlhbWxcIi5ibHVlICsgXCIgZmlsZSB0byBhbiBcIiArIFwidmlueWwgZmlsZSBvYmplY3RcIi5jeWFuLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVzdERhdGEgPSBzbWFydGZpbGUubG9jYWwudG9WaW55bFN5bmMoXCIuL3Rlc3QvbXl0ZXN0Lmpzb25cIik7XHJcbiAgICAgICAgICAgICAgICAodmlueWwuaXNWaW55bCh0ZXN0RGF0YSkpLnNob3VsZC5iZS50cnVlKCk7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKFwiLm1lbW9yeVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgZGVzY3JpYmUoXCIudG9HdWxwU3RyZWFtKClcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCBwcm9kdWNlIGEgdmFsaWQgZ3VscCBzdHJlYW1cIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsQXJyYXkgPSBbXCJ0ZXN0MVwiLFwidGVzdDJcIixcInRlc3QzXCJdO1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLm1lbW9yeS50b0d1bHBTdHJlYW0obG9jYWxBcnJheSlcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShndWxwLmRlc3QoXCIuL3Rlc3QvdGVtcC9cIikpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZXNjcmliZShcInRvVmlueWxGaWxlU3luYygpXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcHJvZHVjZSBhIHZpbnlsRmlsZVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxTdHJpbmcgPSBcIm15U3RyaW5nXCI7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxPcHRpb25zID0ge2ZpbGVuYW1lOlwidmlueWxmaWxlMlwiLGJhc2U6XCIvc29tZURpclwifTtcclxuICAgICAgICAgICAgICAgIChzbWFydGZpbGUubWVtb3J5LnRvVmlueWxGaWxlU3luYyhsb2NhbFN0cmluZyxsb2NhbE9wdGlvbnMpIGluc3RhbmNlb2YgdmlueWwpLnNob3VsZC5iZS50cnVlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NyaWJlKFwidG9WaW55bEFycmF5U3luYygpXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcHJvZHVjZSBhIGFuIGFycmF5IG9mIHZpbnlsZmlsZXNcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsU3RyaW5nQXJyYXkgPSBbXCJzdHJpbmcxXCIsXCJzdHJpbmcyXCIsXCJzdHJpbmczXCJdO1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsT3B0aW9ucyA9IHtmaWxlbmFtZTpcInZpbnlsZmlsZTJcIixiYXNlOlwiL3NvbWVEaXJcIn07XHJcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFJlc3VsdCA9IHNtYXJ0ZmlsZS5tZW1vcnkudG9WaW55bEFycmF5U3luYyhsb2NhbFN0cmluZ0FycmF5LGxvY2FsT3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LnNob3VsZC5iZS5BcnJheSgpO1xyXG4gICAgICAgICAgICAgICAgKHRlc3RSZXN1bHQubGVuZ3RoID09PSAzKS5zaG91bGQuYmUudHJ1ZSgpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbXlLZXkgaW4gdGVzdFJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgKHRlc3RSZXN1bHRbbXlLZXldIGluc3RhbmNlb2YgdmlueWwpLnNob3VsZC5iZS50cnVlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NyaWJlKFwidG9TdHJpbmdTeW5jKClcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCBwcm9kdWNlIGEgU3RyaW5nIGZyb20gdmlueWwgZmlsZVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxTdHJpbmcgPSBzbWFydGZpbGUubWVtb3J5LnRvU3RyaW5nU3luYyhuZXcgdmlueWwoe1xyXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6XCIvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDpcIi90ZXN0LnR4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBuZXcgQnVmZmVyKFwibXlTdHJpbmdcIilcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RyaW5nLnNob3VsZC5lcXVhbChcIm15U3RyaW5nXCIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZXNjcmliZShcInRvRnMoKVwiLGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGl0KFwic2hvdWxkIHdyaXRlIGEgZmlsZSB0byBkaXNrIGFuZCByZXR1cm4gYSBwcm9taXNlXCIsZnVuY3Rpb24oZG9uZSl7XHJcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxTdHJpbmcgPSBcIm15U3RyaW5nXCI7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUubWVtb3J5LnRvRnMoXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTpcIi4vdGVzdC90ZW1wL3Rlc3RNZW1Ub0ZzLnR4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDpwcm9jZXNzLmN3ZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKS50aGVuKGRvbmUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZXNjcmliZShcInRvRnNTeW5jKClcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCB3cml0ZSBhIGZpbGUgdG8gZGlzayBhbmQgcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bGxcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsU3RyaW5nID0gXCJteVN0cmluZ1wiO1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmluZyx7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOlwiLi90ZXN0L3RlbXAvdGVzdE1lbVRvRnNTeW5jLnR4dFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDpwcm9jZXNzLmN3ZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZShcIi5yZW1vdGVcIixmdW5jdGlvbigpe1xyXG4gICAgICAgIGRlc2NyaWJlKFwidG9HdWxwU3RyZWFtU3luYygpXCIsZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaXQoXCJzaG91bGQgcHJvZHVjZSBhIGd1bHAgc3RyZWFtXCIsZnVuY3Rpb24oZG9uZSl7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUucmVtb3RlLnRvR3VscFN0cmVhbVN5bmMoXCJteXRlc3QudHh0XCIsXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHVzaHJvY2tzL3NtYXJ0ZmlsZS9tYXN0ZXIvdGVzdC9cIilcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShzbWFydGZpbGUubG9jYWwudG9HdWxwRGVzdFN5bmMoXCIuL3Rlc3QvdGVtcC9cIikpXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZ0Z1bmN0aW9uKGRvbmUsXCJhdEVuZFwiKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRlc2NyaWJlKFwiLnRvU3RyaW5nKClcIixmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCBsb2FkIGEgcmVtb3RlIGZpbGUgdG8gYSB2YXJpYWJsZVwiLGZ1bmN0aW9uKGRvbmUpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0KDUwMDApO1xyXG4gICAgICAgICAgICAgICAgc21hcnRmaWxlLnJlbW90ZS50b1N0cmluZyhcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9wdXNocm9ja3Mvc21hcnRmaWxlL21hc3Rlci90ZXN0L215dGVzdC50eHRcIilcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZVN0cmluZyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZC5lcXVhbChyZXNwb25zZVN0cmluZyxcIlNvbWUgVGVzdFN0cmluZyAmJiUkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpdChcInNob3VsZCByZWplY3QgYSBQcm9taXNlIHdoZW4gdGhlIGxpbmsgaXMgZmFsc2VcIixmdW5jdGlvbihkb25lKXtcclxuICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCgxMDAwMCk7XHJcbiAgICAgICAgICAgICAgICBzbWFydGZpbGUucmVtb3RlLnRvU3RyaW5nKFwiaHR0cHM6Ly9wdXNoLnJvY2tzL2RvZXNub3RleGlzdC50eHRcIilcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aGlzIHRlc3Qgc2hvdWxkIG5vdCBiZSByZXNvbHZlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9LGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH0pXHJcbn0pO1xyXG4iXX0=