diff --git a/.idea/dictionaries/develar.xml b/.idea/dictionaries/develar.xml index 3b093d007b0..d3ffc1cc326 100644 --- a/.idea/dictionaries/develar.xml +++ b/.idea/dictionaries/develar.xml @@ -14,6 +14,7 @@ coroutine crypto debian + difflet disturl dpkg ebusy diff --git a/.travis.yml b/.travis.yml index 8b51253261c..bd52b5f5bab 100755 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ os: - linux - osx -osx_image: xcode7 +osx_image: xcode7.3 dist: trusty sudo: required diff --git a/package.json b/package.json index 45af010adbe..72561493070 100644 --- a/package.json +++ b/package.json @@ -98,8 +98,9 @@ "babel-plugin-transform-es2015-parameters": "^6.9.0", "babel-plugin-transform-es2015-spread": "^6.8.0", "decompress-zip": "^0.3.0", + "diff": "^2.2.3", "electron-download": "^2.1.2", - "json-parse-helpfulerror": "^1.0.3", + "json8": "^0.9.0", "path-sort": "^0.1.0", "plist": "^1.2.0", "pre-git": "^3.8.4", diff --git a/src/metadata.ts b/src/metadata.ts index 80c61611c3f..a2aa9e5c951 100755 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -360,6 +360,10 @@ export class Platform { return this.name } + toJSON() { + return this.name + } + public createTarget(type?: string | null, arch: Arch = archFromString(process.arch)): Map>> { return new Map([[this, new Map([[arch, type == null ? [] : [type]]])]]) } diff --git a/test/src/BuildTest.ts b/test/src/BuildTest.ts index 4c66e5e242a..6fa9a0d378d 100755 --- a/test/src/BuildTest.ts +++ b/test/src/BuildTest.ts @@ -13,7 +13,7 @@ import { createYargs } from "out/cliOptions" //noinspection JSUnusedLocalSymbols const __awaiter = require("out/awaiter") -test("cli", (t) => { +test("cli", () => { const yargs = createYargs() const base = { @@ -28,14 +28,14 @@ test("cli", (t) => { return normalizeOptions(yargs.parse(input.split(" "))) } - t.deepEqual(parse("--osx"), expected({targets: Platform.OSX.createTarget()})) - t.deepEqual(parse("--linux"), expected({targets: Platform.LINUX.createTarget()})) - t.deepEqual(parse("--win"), expected({targets: Platform.WINDOWS.createTarget()})) - t.deepEqual(parse("-owl"), expected({targets: createTargets([Platform.OSX, Platform.WINDOWS, Platform.LINUX])})) - t.deepEqual(parse("-l tar.gz:ia32"), expected({targets: Platform.LINUX.createTarget("tar.gz", Arch.ia32)})) - t.deepEqual(parse("-l tar.gz:x64"), expected({targets: Platform.LINUX.createTarget("tar.gz", Arch.x64)})) - t.deepEqual(parse("-l tar.gz"), expected({targets: Platform.LINUX.createTarget("tar.gz", archFromString(process.arch))})) - t.deepEqual(parse("-w tar.gz:x64"), expected({targets: Platform.WINDOWS.createTarget("tar.gz", Arch.x64)})) + assertThat(parse("--osx")).isEqualTo(expected({targets: Platform.OSX.createTarget()})) + assertThat(parse("--linux")).isEqualTo(expected({targets: Platform.LINUX.createTarget()})) + assertThat(parse("--win")).isEqualTo(expected({targets: Platform.WINDOWS.createTarget()})) + assertThat(parse("-owl")).isEqualTo(expected({targets: createTargets([Platform.OSX, Platform.WINDOWS, Platform.LINUX])})) + assertThat(parse("-l tar.gz:ia32")).isEqualTo(expected({targets: Platform.LINUX.createTarget("tar.gz", Arch.ia32)})) + assertThat(parse("-l tar.gz:x64")).isEqualTo(expected({targets: Platform.LINUX.createTarget("tar.gz", Arch.x64)})) + assertThat(parse("-l tar.gz")).isEqualTo(expected({targets: Platform.LINUX.createTarget("tar.gz", archFromString(process.arch))})) + assertThat(parse("-w tar.gz:x64")).isEqualTo(expected({targets: Platform.WINDOWS.createTarget("tar.gz", Arch.x64)})) }) test("custom buildResources dir", () => assertPack("test-app-one", allPlatforms(), { diff --git a/test/src/helpers/fileAssert.ts b/test/src/helpers/fileAssert.ts index 73de032fa20..8f19e26f580 100644 --- a/test/src/helpers/fileAssert.ts +++ b/test/src/helpers/fileAssert.ts @@ -1,39 +1,68 @@ import { stat } from "fs-extra-p" +import * as json8 from "json8" +import { green, red, gray } from "chalk" +import { diffJson } from "diff" +import { AssertionError } from "assert" //noinspection JSUnusedLocalSymbols const __awaiter = require("out/awaiter") // http://joel-costigliola.github.io/assertj/ -export function assertThat(path: string) { - return new FileAssertions(path) +export function assertThat(actual: any): Assertions { + return new Assertions(actual) } -class FileAssertions { - constructor (private path: string) { +function jsonReplacer(key: any, value: any): any { + if (value instanceof Map) { + return [...value] + } + return value === undefined ? undefined : value +} + +class Assertions { + constructor (private actual: any) { + } + + isEqualTo(expected: any) { + if (!json8.equal(this.actual, expected)) { + throw new AssertionError({ + message: prettyDiff(JSON.parse(JSON.stringify(this.actual, jsonReplacer)), JSON.parse(JSON.stringify(expected, jsonReplacer))) + }) + } } async isFile() { - const info = await stat(this.path) + const info = await stat(this.actual) if (!info.isFile()) { - throw new Error(`Path ${this.path} is not a file`) + throw new Error(`Path ${this.actual} is not a file`) } } async isDirectory() { - const info = await stat(this.path) + const info = await stat(this.actual) if (!info.isDirectory()) { - throw new Error(`Path ${this.path} is not a directory`) + throw new Error(`Path ${this.actual} is not a directory`) } } async doesNotExist() { try { - await stat(this.path) + await stat(this.actual) } catch (e) { return } - throw new Error(`Path ${this.path} must not exist`) + throw new Error(`Path ${this.actual} must not exist`) } +} + +function prettyDiff(actual: any, expected: any): string { + const diffJson2 = diffJson(expected, actual) + const diff = diffJson2.map(part => { + if (part.added) return green(part.value.replace(/.+/g, ' - $&')) + if (part.removed) return red(part.value.replace(/.+/g, ' + $&')) + return gray(part.value.replace(/.+/g, ' | $&')) + }).join('') + return `\n${diff}\n` } \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json index fadb37a5762..f0380c64e98 100755 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -48,7 +48,8 @@ "../typings/signcode.d.ts", "../typings/yargs.d.ts", "typings/decompress-zip.d.ts", - "typings/json-parse-helpfulerror.d.ts", + "typings/diff.d.ts", + "typings/json8.d.ts", "typings/path-sort.d.ts", "typings/plist.d.ts", "typings/should.d.ts", diff --git a/test/typings/diff.d.ts b/test/typings/diff.d.ts new file mode 100644 index 00000000000..d0027ea50a6 --- /dev/null +++ b/test/typings/diff.d.ts @@ -0,0 +1,69 @@ +// Generated by typings +// Source: https://raw.githubusercontent.com/typed-typings/npm-diff/9b748f41b48c9ddcca5c2a135edd57df25d578cd/lib/index.d.ts +declare module '~diff/lib/index' { +// Type definitions for diff +// Project: https://github.com/kpdecker/jsdiff +// Definitions by: vvakame +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +module JsDiff { + interface IDiffResult { + value: string; + added?: boolean; + removed?: boolean; + } + + interface IBestPath { + newPos: number; + componenets: IDiffResult[]; + } + + class Diff { + ignoreWhitespace:boolean; + + constructor(ignoreWhitespace?:boolean); + + diff(oldString:string, newString:string):IDiffResult[]; + + pushComponent(components:IDiffResult[], value:string, added:boolean, removed:boolean):void; + + extractCommon(basePath:IBestPath, newString:string, oldString:string, diagonalPath:number):number; + + equals(left:string, right:string):boolean; + + join(left:string, right:string):string; + + tokenize(value:string):any; // return types are string or string[] + } + + function diffChars(oldStr:string, newStr:string):IDiffResult[]; + + function diffWords(oldStr:string, newStr:string):IDiffResult[]; + + function diffWordsWithSpace(oldStr:string, newStr:string):IDiffResult[]; + + function diffJson(oldObj: Object, newObj: Object): IDiffResult[]; + + function diffLines(oldStr:string, newStr:string):IDiffResult[]; + + function diffCss(oldStr:string, newStr:string):IDiffResult[]; + + function createPatch(fileName:string, oldStr:string, newStr:string, oldHeader:string, newHeader:string):string; + + function applyPatch(oldStr:string, uniDiff:string):string; + + function convertChangesToXML(changes:IDiffResult[]):string; + + function convertChangesToDMP(changes:IDiffResult[]):{0: number; 1:string;}[]; +} + +export = JsDiff; +} +declare module 'diff/lib/index' { +import alias = require('~diff/lib/index'); +export = alias; +} +declare module 'diff' { +import alias = require('~diff/lib/index'); +export = alias; +} diff --git a/test/typings/json-parse-helpfulerror.d.ts b/test/typings/json-parse-helpfulerror.d.ts deleted file mode 100644 index 773f1cf7152..00000000000 --- a/test/typings/json-parse-helpfulerror.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module "json-parse-helpfulerror" { - export function parse(data: string): any -} \ No newline at end of file diff --git a/test/typings/json8.d.ts b/test/typings/json8.d.ts new file mode 100644 index 00000000000..458fca7c29d --- /dev/null +++ b/test/typings/json8.d.ts @@ -0,0 +1,4 @@ +declare module "json8" { + export function equal(a: any, b: any): boolean + export function serialize(value: any, options?: any): string +} \ No newline at end of file