From 04076465cf2bda0af35fa255a56516aa6f9732ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=B7=E6=B8=A1?= Date: Tue, 18 Dec 2018 00:54:33 +0800 Subject: [PATCH] Add console.count and console.time (#1358) --- js/console.ts | 69 +++++++++++++++++++++++++++++++++++++++++++++- js/console_test.ts | 32 ++++++++++++++++++++- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/js/console.ts b/js/console.ts index 311ca83b78..94ba437311 100644 --- a/js/console.ts +++ b/js/console.ts @@ -351,6 +351,9 @@ export function stringifyArgs( type PrintFunc = (x: string, isErr?: boolean) => void; +const countMap = new Map(); +const timerMap = new Map(); + export class Console { // @internal constructor(private printFunc: PrintFunc) {} @@ -387,7 +390,7 @@ export class Console { * ref: https://console.spec.whatwg.org/#assert */ // tslint:disable-next-line:no-any - assert = (condition?: boolean, ...args: any[]): void => { + assert = (condition = false, ...args: any[]): void => { if (condition) { return; } @@ -406,4 +409,68 @@ export class Console { this.error(`Assertion failed:`, ...args); }; + + count = (label = "default"): void => { + label = String(label); + + if (countMap.has(label)) { + const current = countMap.get(label) || 0; + countMap.set(label, current + 1); + } else { + countMap.set(label, 1); + } + + this.info(`${label}: ${countMap.get(label)}`); + }; + + countReset = (label = "default"): void => { + label = String(label); + + if (countMap.has(label)) { + countMap.set(label, 0); + } else { + this.warn(`Count for '${label}' does not exist`); + } + }; + + time = (label = "default"): void => { + label = String(label); + + if (timerMap.has(label)) { + this.warn(`Timer '${label}' already exists`); + return; + } + + timerMap.set(label, Date.now()); + }; + + // tslint:disable-next-line:no-any + timeLog = (label = "default", ...args: any[]): void => { + label = String(label); + + if (!timerMap.has(label)) { + this.warn(`Timer '${label}' does not exists`); + return; + } + + const startTime = timerMap.get(label) as number; + const duration = Date.now() - startTime; + + this.info(`${label}: ${duration}ms`, ...args); + }; + + timeEnd = (label = "default"): void => { + label = String(label); + + if (!timerMap.has(label)) { + this.warn(`Timer '${label}' does not exists`); + return; + } + + const startTime = timerMap.get(label) as number; + timerMap.delete(label); + const duration = Date.now() - startTime; + + this.info(`${label}: ${duration}ms`); + }; } diff --git a/js/console_test.ts b/js/console_test.ts index 3e6bd6905d..2946d36489 100644 --- a/js/console_test.ts +++ b/js/console_test.ts @@ -2,6 +2,10 @@ import { test, assert, assertEqual } from "./test_util.ts"; import { stringifyArgs } from "./console.ts"; +import { Console } from "./console.ts"; +import { libdeno } from "./libdeno"; +const console = new Console(libdeno.print); + // tslint:disable-next-line:no-any function stringify(...args: any[]): string { return stringifyArgs(args); @@ -114,7 +118,7 @@ test(function consoleTestStringifyCircular() { assertEqual( stringify(console), // tslint:disable-next-line:max-line-length - "Console { printFunc: [Function], log: [Function], debug: [Function], info: [Function], dir: [Function], warn: [Function], error: [Function], assert: [Function] }" + "Console { printFunc: [Function], log: [Function], debug: [Function], info: [Function], dir: [Function], warn: [Function], error: [Function], assert: [Function], count: [Function], countReset: [Function], time: [Function], timeLog: [Function], timeEnd: [Function] }" ); }); @@ -136,6 +140,22 @@ test(function consoleTestStringifyWithDepth() { ); }); +test(function consoleTestCallToStringOnLabel() { + const methods = ["count", "countReset", "time", "timeLog", "timeEnd"]; + + for (const method of methods) { + let hasCalled = false; + + console[method]({ + toString() { + hasCalled = true; + } + }); + + assertEqual(hasCalled, true); + } +}); + test(function consoleTestError() { class MyError extends Error { constructor(errStr: string) { @@ -159,6 +179,11 @@ test(function consoleDetachedLog() { const warn = console.warn; const error = console.error; const consoleAssert = console.assert; + const consoleCount = console.count; + const consoleCountReset = console.countReset; + const consoleTime = console.time; + const consoleTimeLog = console.timeLog; + const consoleTimeEnd = console.timeEnd; log("Hello world"); dir("Hello world"); debug("Hello world"); @@ -166,4 +191,9 @@ test(function consoleDetachedLog() { warn("Hello world"); error("Hello world"); consoleAssert(true); + consoleCount("Hello world"); + consoleCountReset("Hello world"); + consoleTime("Hello world"); + consoleTimeLog("Hello world"); + consoleTimeEnd("Hello world"); });