feat(Deno.inspect): Add sorted, trailingComma, compact and iterableLimit to InspectOptions (denoland/deno#6591)

This commit is contained in:
Nayeem Rahman 2020-07-11 05:52:18 +01:00 committed by denobot
parent 2cda6fbd3c
commit 26b0fa530f
3 changed files with 144 additions and 42 deletions

View File

@ -30,7 +30,10 @@ Don't link to / import any module whose path:
- Is that of a test module or test data: `test.ts`, `foo_test.ts`,
`testdata/bar.txt`.
No stability is guaranteed for these files.
Don't import any symbol with an underscore prefix: `export function _baz() {}`.
These elements are not considered part of the public API, thus no stability is
guaranteed for them.
## Documentation
@ -38,7 +41,7 @@ To browse documentation for modules:
- Go to https://deno.land/std/.
- Navigate to any module of interest.
- Click the "DOCUMENTATION" link.
- Click "View Documentation".
## Contributing

View File

@ -19,8 +19,16 @@ export class AssertionError extends Error {
}
}
function format(v: unknown): string {
let string = globalThis.Deno ? Deno.inspect(v) : String(v);
export function _format(v: unknown): string {
let string = globalThis.Deno
? Deno.inspect(v, {
depth: Infinity,
sorted: true,
trailingComma: true,
compact: false,
iterableLimit: Infinity,
})
: String(v);
if (typeof v == "string") {
string = `"${string.replace(/(?=["\\])/g, "\\")}"`;
}
@ -167,8 +175,8 @@ export function assertEquals(
return;
}
let message = "";
const actualString = format(actual);
const expectedString = format(expected);
const actualString = _format(actual);
const expectedString = _format(expected);
try {
const diffResult = diff(
actualString.split("\n"),
@ -248,8 +256,8 @@ export function assertStrictEquals<T>(
if (msg) {
message = msg;
} else {
const actualString = format(actual);
const expectedString = format(expected);
const actualString = _format(actual);
const expectedString = _format(expected);
if (actualString === expectedString) {
const withOffset = actualString
@ -335,9 +343,9 @@ export function assertArrayContains(
return;
}
if (!msg) {
msg = `actual: "${format(actual)}" expected to contain: "${format(
msg = `actual: "${_format(actual)}" expected to contain: "${_format(
expected
)}"\nmissing: ${format(missing)}`;
)}"\nmissing: ${_format(missing)}`;
}
throw new AssertionError(msg);
}

View File

@ -1,5 +1,6 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
import {
_format,
assert,
assertNotEquals,
assertStringContains,
@ -15,7 +16,7 @@ import {
unimplemented,
unreachable,
} from "./asserts.ts";
import { red, green, gray, bold, yellow } from "../fmt/colors.ts";
import { red, green, gray, bold, yellow, stripColor } from "../fmt/colors.ts";
Deno.test("testingEqual", function (): void {
assert(equal("world", "world"));
@ -176,7 +177,23 @@ Deno.test("testingArrayContains", function (): void {
assertThrows(
(): void => assertArrayContains(fixtureObject, [{ deno: "node" }]),
AssertionError,
`actual: "[ { deno: "luv" }, { deno: "Js" } ]" expected to contain: "[ { deno: "node" } ]"\nmissing: [ { deno: "node" } ]`
`actual: "[
{
deno: "luv",
},
{
deno: "Js",
},
]" expected to contain: "[
{
deno: "node",
},
]"
missing: [
{
deno: "node",
},
]`
);
});
@ -342,13 +359,13 @@ Deno.test({
assertThrows(
(): void => assertEquals([1, "2", 3], ["1", "2", 3]),
AssertionError,
`
[
"Values are not equal:",
...createHeader(),
removed(`- [ ${yellow("1")}, ${green('"2"')}, ${yellow("3")} ]`),
added(`+ [ ${green('"1"')}, ${green('"2"')}, ${yellow("3")} ]`),
"",
].join("\n")
- 1,
+ "1",
"2",
3,
]`
);
},
});
@ -359,17 +376,16 @@ Deno.test({
assertThrows(
(): void => assertEquals({ a: 1, b: "2", c: 3 }, { a: 1, b: 2, c: [3] }),
AssertionError,
[
"Values are not equal:",
...createHeader(),
removed(
`- { a: ${yellow("1")}, b: ${green('"2"')}, c: ${yellow("3")} }`
),
added(
`+ { a: ${yellow("1")}, b: ${yellow("2")}, c: [ ${yellow("3")} ] }`
),
"",
].join("\n")
`
{
a: 1,
+ b: 2,
+ c: [
+ 3,
+ ],
- b: "2",
- c: 3,
}`
);
},
});
@ -418,13 +434,14 @@ Deno.test({
assertThrows(
(): void => assertStrictEquals({ a: 1, b: 2 }, { a: 1, c: [3] }),
AssertionError,
[
"Values are not strictly equal:",
...createHeader(),
removed(`- { a: ${yellow("1")}, b: ${yellow("2")} }`),
added(`+ { a: ${yellow("1")}, c: [ ${yellow("3")} ] }`),
"",
].join("\n")
`
{
a: 1,
+ c: [
+ 3,
+ ],
- b: 2,
}`
);
},
});
@ -435,10 +452,12 @@ Deno.test({
assertThrows(
(): void => assertStrictEquals({ a: 1, b: 2 }, { a: 1, b: 2 }),
AssertionError,
[
"Values have the same structure but are not reference-equal:\n",
red(` { a: ${yellow("1")}, b: ${yellow("2")} }`),
].join("\n")
`Values have the same structure but are not reference-equal:
{
a: 1,
b: 2,
}`
);
},
});
@ -535,3 +554,75 @@ Deno.test("Assert Throws Async Non-Error Fail", () => {
"A non-Error object was thrown or rejected."
);
});
Deno.test("assertEquals diff for differently ordered objects", () => {
assertThrows(
() => {
assertEquals(
{
aaaaaaaaaaaaaaaaaaaaaaaa: 0,
bbbbbbbbbbbbbbbbbbbbbbbb: 0,
ccccccccccccccccccccccc: 0,
},
{
ccccccccccccccccccccccc: 1,
aaaaaaaaaaaaaaaaaaaaaaaa: 0,
bbbbbbbbbbbbbbbbbbbbbbbb: 0,
}
);
},
AssertionError,
`
{
aaaaaaaaaaaaaaaaaaaaaaaa: 0,
bbbbbbbbbbbbbbbbbbbbbbbb: 0,
- ccccccccccccccccccccccc: 0,
+ ccccccccccccccccccccccc: 1,
}`
);
});
// Check that the diff formatter overrides some default behaviours of
// `Deno.inspect()` which are problematic for diffing.
Deno.test("assert diff formatting", () => {
// Wraps objects into multiple lines even when they are small. Prints trailing
// commas.
assertEquals(
stripColor(_format({ a: 1, b: 2 })),
`{
a: 1,
b: 2,
}`
);
// Same for nested small objects.
assertEquals(
stripColor(_format([{ x: { a: 1, b: 2 }, y: ["a", "b"] }])),
`[
{
x: {
a: 1,
b: 2,
},
y: [
"a",
"b",
],
},
]`
);
// Grouping is disabled.
assertEquals(
stripColor(_format(["i", "i", "i", "i", "i", "i", "i"])),
`[
"i",
"i",
"i",
"i",
"i",
"i",
"i",
]`
);
});