diff --git a/.gitignore b/.gitignore index 4fb759d..c9d0b4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules dist npm-debug.log -coverage \ No newline at end of file +coverage +.prettierrc.yaml diff --git a/src/index.test.ts b/src/index.test.ts index f3b13a9..361ad96 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,7 +1,55 @@ -//write tests here +import { testSeed1, testSeed2, testSeed2Expected, testSeed3, testSeed3Expected } from './mockTestData' +import { IEvent, eventStream, assignPointValue, assignRegionScore } from '../src/index' -describe('Tests will go here!', () => { - it('should pass', () => { - expect(true).toBeTruthy() +describe('event puzzler solution', () => { + + describe('eventStream()', () => { + + it('return the given stream if there are 5 events or less', () => { + const actual: ReadonlyArray = eventStream(testSeed1) + expect(actual).toEqual(testSeed1) + }) + + it('returns the region with with the highest cumulative point value from the input', () => { + const actual: ReadonlyArray = eventStream(testSeed2) + const expected: ReadonlyArray = testSeed2Expected + expect(actual).toEqual(expected) + }) + + it('should return first region in stream when cumlative point value ties another region', () => { + const actual: ReadonlyArray = eventStream(testSeed3) + const expected: ReadonlyArray = testSeed3Expected + expect(actual).toEqual(expected) + }) + }) + + describe('assignpointValue()', () => { + + it('return 1 if passed "newMessage"', () => { + const actual: number = assignPointValue('newMessage') + expect(actual).toEqual(1) + }) + + it('return 2 if passed "view"', () => { + const actual: number = assignPointValue('view') + expect(actual).toEqual(2) + }) + + it('return 3 if passed "screenShot"', () => { + const actual: number = assignPointValue('screenShot') + expect(actual).toEqual(3) + }) + }) + + describe('assignRegionScore()', () => { + it('should return the cumlative value of eventType starting at index for regionLegnth given', () => { + const actual: number = assignRegionScore(testSeed2, 1, 5) + expect(actual).toEqual(9) + }) + + it('should only count to the end of the array', () => { + const actual: number = assignRegionScore(testSeed2, 1, 50) + expect(actual).toEqual(16) + }) }) -}) \ No newline at end of file +}) diff --git a/src/index.ts b/src/index.ts index af2e288..b241f24 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,38 @@ -//Define class/functions here \ No newline at end of file +export interface IEvent { + readonly timestamp: number + readonly eventType: EventType +} +export type EventType = 'newMessage' | 'screenShot' | 'view' + +export function eventStream( + stream: IEvent[], + regionLength: number = 5 +): ReadonlyArray { + if (stream.length <= regionLength) return stream + + const regionValues: number[] = [...stream].map((next, index, stream) => + assignRegionScore(stream, index, regionLength) + ) + const index = regionValues.indexOf(Math.max(...regionValues)) + const region = [...stream].splice(index, regionLength) + return region +} + +export function assignPointValue(eventType: EventType): Readonly { + switch (eventType) { + case 'newMessage': + return 1 + case 'view': + return 2 + case 'screenShot': + return 3 + default: + throw new Error('Not a valid eventType') + } +} + +export function assignRegionScore(stream: IEvent[], index: number, regionLength: number): number { + const region = [...stream].splice(index, regionLength) + const regionScore = region.reduce((acc, event) => (acc + assignPointValue(event.eventType)), 0) + return regionScore +} diff --git a/src/mockTestData.ts b/src/mockTestData.ts new file mode 100644 index 0000000..5d89de6 --- /dev/null +++ b/src/mockTestData.ts @@ -0,0 +1,201 @@ +import { IEvent } from '../src/index' + +export const testSeed1: Array = [ + { + timestamp: 123123123, + eventType: 'newMessage', + }, + { + timestamp: 123123124, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'view', + }, +] + +export const testSeed2: Array = [ + { + timestamp: 123123123, + eventType: 'newMessage', + }, + { + timestamp: 123123124, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, +] + +export const testSeed2Expected: Array = [ + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'screenShot', + }, +] + +export const testSeed3: Array = [ + { + timestamp: 123123123, + eventType: 'newMessage', + }, + { + timestamp: 123123124, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 4587456, + eventType: 'newMessage', + }, + { + timestamp: 46464, + eventType: 'newMessage', + }, + { + timestamp: 46463125, + eventType: 'newMessage', + }, + { + timestamp: 464625, + eventType: 'view', + }, + { + timestamp: 464625, + eventType: 'view', + }, +] + +export const testSeed3Expected: Array = [ + { + timestamp: 123123123, + eventType: 'newMessage', + }, + { + timestamp: 123123124, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'newMessage', + }, + { + timestamp: 123123125, + eventType: 'view', + }, + { + timestamp: 123123125, + eventType: 'view', + }, +] + +// export const testSeed4: Array = [ +// { +// timestamp: 123123123, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 123123124, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 123123125, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 123123125, +// eventType: 'view', +// value: 2, +// }, +// { +// timestamp: 123123125, +// eventType: 'view', +// value: 2, +// }, +// { +// timestamp: 4587456, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 46464, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 46463125, +// eventType: 'newMessage', +// value: 1, +// }, +// { +// timestamp: 464625, +// eventType: 'view', +// value: 2, +// }, +// { +// timestamp: 464625, +// eventType: 'view', +// value: 2, +// }, +// ]