|
| 1 | +import { expect } from 'chai'; |
| 2 | +import { |
| 3 | + messagesToLines, |
| 4 | + truncateLines, |
| 5 | +} from '../../browser/monitor/monitor-utils'; |
| 6 | +import { Line } from '../../browser/monitor/serial-monitor-send-output'; |
| 7 | +import { set, reset } from 'mockdate'; |
| 8 | + |
| 9 | +type TestLine = { |
| 10 | + messages: string[]; |
| 11 | + prevLines?: { lines: Line[]; charCount: number }; |
| 12 | + expected: { lines: Line[]; charCount: number }; |
| 13 | + expectedTruncated?: { |
| 14 | + lines: Line[]; |
| 15 | + charCount: number; |
| 16 | + maxCharacters?: number; |
| 17 | + }; |
| 18 | +}; |
| 19 | + |
| 20 | +const date = new Date(); |
| 21 | +const testLines: TestLine[] = [ |
| 22 | + { |
| 23 | + messages: ['Hello'], |
| 24 | + expected: { lines: [{ message: 'Hello' }], charCount: 5 }, |
| 25 | + }, |
| 26 | + { |
| 27 | + messages: ['Hello', 'Dog!'], |
| 28 | + expected: { lines: [{ message: 'HelloDog!' }], charCount: 9 }, |
| 29 | + }, |
| 30 | + { |
| 31 | + messages: ['Hello\n', 'Dog!'], |
| 32 | + expected: { |
| 33 | + lines: [{ message: 'Hello\n' }, { message: 'Dog!' }], |
| 34 | + charCount: 10, |
| 35 | + }, |
| 36 | + }, |
| 37 | + { |
| 38 | + messages: ['Dog!'], |
| 39 | + prevLines: { lines: [{ message: 'Hello\n' }], charCount: 6 }, |
| 40 | + expected: { |
| 41 | + lines: [{ message: 'Hello\n' }, { message: 'Dog!' }], |
| 42 | + charCount: 10, |
| 43 | + }, |
| 44 | + }, |
| 45 | + { |
| 46 | + messages: [' Dog!\n', " Who's a good ", 'boy?\n', "You're a good boy!"], |
| 47 | + prevLines: { lines: [{ message: 'Hello' }], charCount: 5 }, |
| 48 | + expected: { |
| 49 | + lines: [ |
| 50 | + { message: 'Hello Dog!\n' }, |
| 51 | + { message: " Who's a good boy?\n" }, |
| 52 | + { message: "You're a good boy!" }, |
| 53 | + ], |
| 54 | + charCount: 48, |
| 55 | + }, |
| 56 | + expectedTruncated: { |
| 57 | + maxCharacters: 20, |
| 58 | + charCount: 20, |
| 59 | + lines: [{ message: '?\n' }, { message: "You're a good boy!" }], |
| 60 | + }, |
| 61 | + }, |
| 62 | + { |
| 63 | + messages: ['boy?\n', "You're a good boy!"], |
| 64 | + prevLines: { |
| 65 | + lines: [{ message: 'Hello Dog!\n' }, { message: " Who's a good " }], |
| 66 | + charCount: 25, |
| 67 | + }, |
| 68 | + expected: { |
| 69 | + lines: [ |
| 70 | + { message: 'Hello Dog!\n' }, |
| 71 | + { message: " Who's a good boy?\n" }, |
| 72 | + { message: "You're a good boy!" }, |
| 73 | + ], |
| 74 | + charCount: 48, |
| 75 | + }, |
| 76 | + expectedTruncated: { |
| 77 | + maxCharacters: 20, |
| 78 | + charCount: 20, |
| 79 | + lines: [{ message: '?\n' }, { message: "You're a good boy!" }], |
| 80 | + }, |
| 81 | + }, |
| 82 | + { |
| 83 | + messages: ["Who's a good boy?\n", 'Yo'], |
| 84 | + prevLines: { |
| 85 | + lines: [{ message: 'Hello Dog!\n' }], |
| 86 | + charCount: 11, |
| 87 | + }, |
| 88 | + expected: { |
| 89 | + lines: [ |
| 90 | + { message: 'Hello Dog!\n' }, |
| 91 | + { message: "Who's a good boy?\n" }, |
| 92 | + { message: 'Yo' }, |
| 93 | + ], |
| 94 | + charCount: 31, |
| 95 | + }, |
| 96 | + expectedTruncated: { |
| 97 | + maxCharacters: 20, |
| 98 | + charCount: 20, |
| 99 | + lines: [{ message: "Who's a good boy?\n" }, { message: 'Yo' }], |
| 100 | + }, |
| 101 | + }, |
| 102 | +]; |
| 103 | + |
| 104 | +testLines.forEach((t) => |
| 105 | + [...t.expected.lines, ...(t.prevLines?.lines || [])].forEach( |
| 106 | + (l) => (l.timestamp = date) |
| 107 | + ) |
| 108 | +); |
| 109 | + |
| 110 | +describe.only('Monitor Utils', () => { |
| 111 | + beforeEach(() => { |
| 112 | + set(date); |
| 113 | + }); |
| 114 | + |
| 115 | + afterEach(() => { |
| 116 | + reset(); |
| 117 | + }); |
| 118 | + |
| 119 | + testLines.forEach((testLine) => { |
| 120 | + context('when converting messages', () => { |
| 121 | + it('should give the right result', () => { |
| 122 | + const [newLines, addedCharCount] = messagesToLines( |
| 123 | + testLine.messages, |
| 124 | + testLine.prevLines?.lines, |
| 125 | + testLine.prevLines?.charCount |
| 126 | + ); |
| 127 | + newLines.forEach((line, index) => { |
| 128 | + expect(line.message).to.equal(testLine.expected.lines[index].message); |
| 129 | + expect(line.timestamp).to.deep.equal( |
| 130 | + testLine.expected.lines[index].timestamp |
| 131 | + ); |
| 132 | + }); |
| 133 | + expect(addedCharCount).to.equal(testLine.expected.charCount); |
| 134 | + |
| 135 | + const [truncatedLines, totalCharCount] = truncateLines( |
| 136 | + newLines, |
| 137 | + addedCharCount, |
| 138 | + testLine.expectedTruncated?.maxCharacters |
| 139 | + ); |
| 140 | + let charCount = 0; |
| 141 | + if (testLine.expectedTruncated) { |
| 142 | + truncatedLines.forEach((line, index) => { |
| 143 | + expect(line.message).to.equal( |
| 144 | + testLine.expectedTruncated?.lines[index].message |
| 145 | + ); |
| 146 | + charCount += line.message.length; |
| 147 | + }); |
| 148 | + expect(totalCharCount).to.equal(charCount); |
| 149 | + } |
| 150 | + }); |
| 151 | + }); |
| 152 | + }); |
| 153 | +}); |
0 commit comments