From 7c88c0bcca6e47cca4e2632df8ced778fa38c341 Mon Sep 17 00:00:00 2001 From: "caleb.mabry.15@cnu.edu" Date: Wed, 23 Mar 2022 00:33:18 -0400 Subject: Final commit --- webAO/utils/__tests__/aoml.test.ts | 113 +++++++++++++++++++++++++++++++++++++ webAO/utils/aoml.ts | 51 ++++++----------- 2 files changed, 131 insertions(+), 33 deletions(-) create mode 100644 webAO/utils/__tests__/aoml.test.ts (limited to 'webAO/utils') diff --git a/webAO/utils/__tests__/aoml.test.ts b/webAO/utils/__tests__/aoml.test.ts new file mode 100644 index 0000000..fa8ade4 --- /dev/null +++ b/webAO/utils/__tests__/aoml.test.ts @@ -0,0 +1,113 @@ +import request from '../../services/request' +import mlConfig from '../aoml'; + +jest.mock('../../services/request') +const networkRequest = ` +c0 = 247, 247, 247 +c0_name = White +c0_talking = 1 + +c2 = 247, 0, 57 +c2_name = Red +c2_start = ~ +c2_end = ~ +c2_remove = 1 +c2_talking = 1 + +c4 = 107, 198, 247 +c4_name = Blue +c4_start = ( +c4_end = ) +c4_remove = 0 +c4_talking = 0 + +c5 = 107, 198, 247 +c5_name = Blue +c5_start = [ +c5_end = ] +c5_remove = 1 +c5_talking = 0 + +c6 = 107, 198, 247 +c6_name = Blue +c6_start = | +c6_end = | +c6_remove = 0 +c6_talking = 0 +` + +const mockRequest = request as jest.MockedFunction; +mockRequest.mockReturnValue(Promise.resolve(networkRequest)) + + describe('mlConfig', () => { + beforeEach(() => { + // Clear all instances and calls to constructor and all methods: + mockRequest.mockClear(); + + }); + + it('Should make a network request', () => { + mlConfig('localhost') + expect(mockRequest).toHaveBeenCalledTimes(1); + }); + }) + describe('applyMarkdown', () => { + const config = mlConfig('localhost') + + beforeEach(() => { + // Clear all instances and calls to constructor and all methods: + mockRequest.mockClear(); + + }); + + it('Should create an array of spans containing letters', async () => { + const word = `hello` + const actual = await config.applyMarkdown(`hello`, `blue`) + let index = 0 + for (const element of actual) { + expect(element.innerHTML).toBe(word[index]) + index++ + } + }) + it('Should add colors based on settings', async () => { + const config = mlConfig('localhost') + const actual = await config.applyMarkdown(`(heya)`, `blue`) + expect(actual[0].getAttribute('style')).toBe('color: rgb(107, 198, 247);') + }) + it('Should keep a letter if remove = 0', async () => { + const config = mlConfig('localhost') + + const actual = await config.applyMarkdown(`(What())Hey!`, `white`) + const expected = `(` + expect(actual[5].innerHTML).toBe(expected) + }) + it('Should remove a letter if remove = 1', async () => { + const config = mlConfig('localhost') + + const actual = await config.applyMarkdown(`~What~()Hey!`, `white`) + const expected = `` + expect(actual[0].innerHTML).toBe(expected) + }) + it('Should remove a letter if remove = 1', async () => { + const config = mlConfig('localhost') + + const actual = await config.applyMarkdown(`~What~()Hey!`, `white`) + const expected = `` + expect(actual[0].innerHTML).toBe(expected) + }) + it('Should keep a closing letter if remove = 0', async () => { + const config = mlConfig('localhost') + + const actual = await config.applyMarkdown(`~NO[]~!`, `white`) + const expected = `]` + expect(actual[4].innerHTML).toBe(expected) + }) + it('Should remove a closing letter if remove = 1', async () => { + const config = mlConfig('localhost') + const actual = await config.applyMarkdown(`~NO||~!`, `white`) + const expected = `` + expect(actual[5].innerHTML).toBe(expected) + }) + + }) + diff --git a/webAO/utils/aoml.ts b/webAO/utils/aoml.ts index 898d8fb..fb26db8 100644 --- a/webAO/utils/aoml.ts +++ b/webAO/utils/aoml.ts @@ -32,46 +32,34 @@ const aomlParser = (text: string) => { return parsed } - - - const mlConfig = (AO_HOST) => { const defaultUrl = `${AO_HOST}themes/default/chat_config.ini` - let aomlParsed: {[key: string]: Aoml} = {} + let aomlParsed: Promise<{[key: string]: Aoml}> = request(defaultUrl).then((data) => aomlParser(data)); - request(defaultUrl).then((data) => { - aomlParsed = aomlParser(data) - } - ); + - const createIdentifiers = () => { + const createIdentifiers = async () => { const identifiers = new Map() - for (const [ruleName, value] of Object.entries(aomlParsed)) { - if (identifiers.has(value.start)) { - throw new Error() - } - else if (value.start && value.end) { + for (const [ruleName, value] of Object.entries(await aomlParsed)) { + if (value.start && value.end) { identifiers.set(value.start, value) identifiers.set(value.end, value) - } - - + } } return identifiers } - const createStartIdentifiers = () => { + const createStartIdentifiers = async () => { const startingIdentifiers = new Set() - for (const [ruleName, value] of Object.entries(aomlParsed)) { + for (const [ruleName, value] of Object.entries(await aomlParsed)) { if (value?.start && value?.end) { startingIdentifiers.add(value.start) } } return startingIdentifiers } - - const applyMarkdown = (text: string, defaultColor: string) => { - const identifiers = createIdentifiers() - const startIdentifiers = createStartIdentifiers() + const applyMarkdown = async (text: string, defaultColor: string) => { + const identifiers = await createIdentifiers() + const startIdentifiers = await createStartIdentifiers() const closingStack = [] const colorStack = [] // each value in output will be an html element @@ -81,7 +69,8 @@ const mlConfig = (AO_HOST) => { let currentIdentifier = identifiers.get(letter) const currentClosingLetter = closingStack[closingStack.length-1] const keepChar = Number(currentIdentifier?.remove) === 0 - console.log(startIdentifiers) + console.log(currentClosingLetter, letter, keepChar) + if (startIdentifiers.has(letter)) { const color = identifiers.get(letter).color.split(',') const r = color[0] @@ -95,15 +84,11 @@ const mlConfig = (AO_HOST) => { currentSelector.innerHTML = letter } } else if (currentClosingLetter === letter) { - if (colorStack.length === 0) { - currentSelector.className = `test_${defaultColor}` - } else { - const r = colorStack[colorStack.length-1][0] - const g = colorStack[colorStack.length-1][1] - const b = colorStack[colorStack.length-1][2] - const currentColor = `color: rgb(${r},${g},${b});` - currentSelector.setAttribute('style', currentColor) - } + const r = colorStack[colorStack.length-1][0] + const g = colorStack[colorStack.length-1][1] + const b = colorStack[colorStack.length-1][2] + const currentColor = `color: rgb(${r},${g},${b});` + currentSelector.setAttribute('style', currentColor) closingStack.pop() colorStack.pop() if (keepChar) { -- cgit