diff --git a/__tests__/async-syntax-highlighter.js b/__tests__/async-syntax-highlighter.js new file mode 100644 index 000000000..527677a00 --- /dev/null +++ b/__tests__/async-syntax-highlighter.js @@ -0,0 +1,89 @@ +import React from 'react'; +import renderer from 'react-test-renderer'; +import AsyncSyntaxHighlighter from "../src/async-syntax-highlighter"; + +test('AsyncSyntaxHighlighter registerLanguage when registerLanguage is undefined', () => { + const SyntaxHighlighter = AsyncSyntaxHighlighter({}); + + SyntaxHighlighter.registerLanguage("test", {}); + expect(SyntaxHighlighter.languages).toEqual([]); +}); + +test('AsyncSyntaxHighlighter registerLanguage when registerLanguage is defined but astGenerator isn\'t', () => { + const registerLanguage = jest.fn(); + const SyntaxHighlighter = AsyncSyntaxHighlighter({ registerLanguage }); + + SyntaxHighlighter.registerLanguage("test", {}); + expect(SyntaxHighlighter.languages).toEqual([ { name: "test", language: {} }]); +}); + +test('AsyncSyntaxHighlighter registerLanguage when registerLanguage & astGenerator is defined', () => { + const registerLanguage = jest.fn(); + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ registerLanguage }); + SyntaxHighlighter.astGenerator = { test: '123' }; + + SyntaxHighlighter.registerLanguage("test", {}); + expect(SyntaxHighlighter.languages).not.toEqual([ { name: "test", language: {} }]); + expect(registerLanguage).toBeCalledWith(SyntaxHighlighter.astGenerator, "test", {}) +}); + +test('AsyncSyntaxHighlighter isRegistered when registerLanguage is not defined', () => { + const SyntaxHighlighter = AsyncSyntaxHighlighter({ }); + + expect(SyntaxHighlighter.isRegistered("test")).toEqual(true); +}); + +test('AsyncSyntaxHighlighter isRegistered when astGenerator is not defined it checks the languages array', () => { + const registerLanguage = jest.fn(); + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ registerLanguage }); + SyntaxHighlighter.astGenerator = null; + SyntaxHighlighter.languages.push({ name: 'test' }) + expect(SyntaxHighlighter.isRegistered('test')).toEqual(true); +}); + +test('AsyncSyntaxHighlighter isRegistered when astGenerator is defined it should call isLanguageRegistered', () => { + const registerLanguage = jest.fn(); + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ registerLanguage }); + SyntaxHighlighter.astGenerator = null; + SyntaxHighlighter.languages.push({ name: 'test' }) + expect(SyntaxHighlighter.isRegistered('test')).toEqual(true); +}); + +test('AsyncSyntaxHighlighter loadAstGenerator should return the promise of the loader', () => { + const testValue = "test"; + const loader = jest.fn().mockReturnValue({ + then: jest.fn().mockReturnValue(testValue) + }) + + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ loader }); + expect(SyntaxHighlighter.loadAstGenerator()).toEqual(testValue); +}); + +test('AsyncSyntaxHighlighter loadAstGenerator when astGenerator resolves', async () => { + const astGenerator = "test"; + const loader = jest.fn().mockResolvedValue(astGenerator) + + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ loader }); + await SyntaxHighlighter.loadAstGenerator(); + expect(SyntaxHighlighter.astGenerator).toEqual(astGenerator) +}); + +test('AsyncSyntaxHighlighter loadAstGenerator when astGenerator resolves and it has languages in the language array', async () => { + const astGenerator = "test"; + const registerLanguage = jest.fn(); + const loader = jest.fn().mockResolvedValue(astGenerator) + + + const SyntaxHighlighter = AsyncSyntaxHighlighter({ loader, registerLanguage }); + const testLanguage = { name: "cpp", language: { } }; + + SyntaxHighlighter.languages.push(testLanguage); + + await SyntaxHighlighter.loadAstGenerator(); + expect(registerLanguage).toBeCalledWith(astGenerator, testLanguage.name, testLanguage.language) +}); \ No newline at end of file diff --git a/__tests__/prism-async-light.js b/__tests__/prism-async-light.js index 0e9c695c6..8ecebc8ce 100644 --- a/__tests__/prism-async-light.js +++ b/__tests__/prism-async-light.js @@ -3,8 +3,6 @@ import renderer from 'react-test-renderer'; import { PrismAsyncLight as SyntaxHighlighter } from "../src"; import prism from "../src/styles/prism/prism"; - - test('SyntaxHighlighter renders jsx highlighted text', () => { const tree = renderer.create( @@ -47,7 +45,6 @@ test('SyntaxHighlighter should just render text if syntax is not registered', () }); test('When the code split is loaded - SyntaxHighlighter renders jsx highlighted text', async () => { - await SyntaxHighlighter.preload(); const tree = renderer.create( @@ -77,4 +74,4 @@ test('When the code split is loaded - SyntaxHighlighter renders jsx highlighted ).toJSON(); expect(tree).toMatchSnapshot(); -}); \ No newline at end of file +}); diff --git a/src/async-syntax-highlighter.js b/src/async-syntax-highlighter.js index 3209342c2..d78dc78e1 100644 --- a/src/async-syntax-highlighter.js +++ b/src/async-syntax-highlighter.js @@ -24,7 +24,7 @@ export default (options) => { if (!ReactAsyncHighlighter.astGenerator) { // Ast generator not available yet, but language will be registered once it is. - return ReactAsyncHighlighter.languages.includes(item => item.name === language); + return ReactAsyncHighlighter.languages.findIndex(item => item.name === language) > -1; } return isLanguageRegistered(ReactAsyncHighlighter.astGenerator, language); @@ -44,7 +44,6 @@ export default (options) => { }); } }; - static loadAstGenerator() { ReactAsyncHighlighter.astGeneratorPromise = loader().then(astGenerator => {