Skip to content

Commit 56544e3

Browse files
SkyaTuraShinigami92
authored andcommitted
Add warning tester
1 parent a66432d commit 56544e3

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

src/logger.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ export interface ILogger {
1717
error: typeof console.error;
1818
}
1919

20+
/**
21+
*
22+
*/
23+
export type LoggerListener = (level: LogLevel, message?: unknown, ...optionalParams: any[]) => void;
24+
2025
/** The logger class. */
2126
export class Logger implements ILogger {
2227
private static readonly LOG_LEVELS: ['debug', 'log', 'info', 'warn', 'error'] = [
@@ -27,6 +32,8 @@ export class Logger implements ILogger {
2732
'error'
2833
];
2934

35+
private readonly listeners: LoggerListener[] = [];
36+
3037
/**
3138
* Constructs a new logger.
3239
*
@@ -103,12 +110,32 @@ export class Logger implements ILogger {
103110
this.message(LogLevel.ERROR, message, ...optionalParams);
104111
}
105112

113+
/**
114+
* Adds a log listener.
115+
*
116+
* @param callback The listener callback.
117+
*/
118+
public addListener(callback: LoggerListener): void {
119+
this.listeners.push(callback);
120+
}
121+
122+
/**
123+
* Removes a log listener.
124+
*
125+
* @param callback The listener callback.
126+
*/
127+
public removeListener(callback: LoggerListener): void {
128+
const index: number = this.listeners.indexOf(callback);
129+
this.listeners.splice(index, 1);
130+
}
131+
106132
private message(level: LogLevel, message?: any, ...optionalParams: any[]): void {
107133
if (this.level !== LogLevel.OFF && this.level <= level) {
108134
const logLevel: 'debug' | 'log' | 'info' | 'warn' | 'error' | undefined =
109135
Logger.LOG_LEVELS[level as number];
110136
if (logLevel) {
111137
this.logger[logLevel](message, ...optionalParams);
138+
this.listeners.forEach((cb) => cb(level, message, ...optionalParams));
112139
}
113140
}
114141
}

src/printer.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,14 @@ import {
8181
} from './utils/common';
8282
import { isVueEventBinding, isVueExpression, isVueVForWithOf, isVueVOnExpression } from './utils/vue';
8383

84+
/**
85+
* Printer logger instance.
86+
*/
8487
const logger: Logger = createLogger(console);
88+
/**
89+
*
90+
*/
91+
export const loggerInstance: Logger = logger;
8592
if (process.env.NODE_ENV === 'test') {
8693
logger.setLogLevel(LogLevel.DEBUG);
8794
}
@@ -436,21 +443,21 @@ export class PugPrinter {
436443
`code: \`${code.trim()}\``
437444
);
438445
} else if (error.includes("Unexpected token '('")) {
439-
if (this.framework !== 'vue') {
446+
if (this.framework === 'angular') {
440447
logger.warn(
441448
'[PugPrinter:formatText]: Found unexpected token `(`.',
442449
`code: \`${code.trim()}\``
443450
);
444451
}
445452
} else if (error.includes('Missing expected `)`')) {
446-
if (this.framework !== 'vue') {
453+
if (this.framework === 'angular') {
447454
logger.warn(
448455
'[PugPrinter:formatText]: Missing expected `)`.',
449456
`code: \`${code.trim()}\``
450457
);
451458
}
452459
} else if (error.includes('Missing expected `:`')) {
453-
if (this.framework !== 'vue') {
460+
if (this.framework === 'angular') {
454461
logger.warn(
455462
'[PugPrinter:formatText]: Missing expected `:`.',
456463
`code: \`${code.trim()}\``
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
p {{ foo( }}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { readFileSync } from 'fs';
2+
import { resolve } from 'path';
3+
import { format } from 'prettier';
4+
import { plugin } from '../../../src/index';
5+
import { LoggerListener } from '../../../src/logger';
6+
import { loggerInstance } from '../../../src/printer';
7+
8+
const loggerListener: LoggerListener = jest.fn();
9+
10+
const getFormatWarnings = (): string[] =>
11+
loggerListener.mock.calls
12+
.filter((call) => call[0] === 3)
13+
.filter((call) => call[1].toString().startsWith('[PugPrinter:formatText]: '))
14+
.map((call) => call[1].toString().substring(25));
15+
16+
const getCode = (filename: string): string => readFileSync(resolve(__dirname, filename), 'utf8');
17+
18+
beforeAll(() => {
19+
loggerInstance.addListener(loggerListener);
20+
});
21+
beforeEach(() => {
22+
// Clear all instances and calls to constructor and all methods:
23+
loggerListener.mockClear();
24+
});
25+
afterAll(() => {
26+
loggerInstance.removeListener(loggerListener);
27+
});
28+
29+
describe('Frameworks', () => {
30+
describe('Angular', () => {
31+
test('foo-bar', () => {
32+
// this test is not completed yet
33+
const code: string = getCode('unexpected-end-of-expression.pug');
34+
format(code, {
35+
parser: 'pug',
36+
plugins: [plugin],
37+
38+
// @ts-expect-error
39+
pugFramework: 'angular'
40+
});
41+
const thrownWarnings: string[] = getFormatWarnings();
42+
43+
expect(thrownWarnings).toContain('');
44+
});
45+
});
46+
});

0 commit comments

Comments
 (0)