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