diff --git a/src/index.test.ts b/src/index.test.ts index f3b13a9..c11c427 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,7 +1,32 @@ -//write tests here +import { eventStream } from './test_data'; +import { scoreEventStream } from '.'; -describe('Tests will go here!', () => { - it('should pass', () => { - expect(true).toBeTruthy() +describe('scoreEventStream', () => { + it('should return an object with an events property and a score property', () => { + const actual = scoreEventStream(eventStream); + + expect(actual).toHaveProperty("events"); + expect(actual).toHaveProperty("score"); + }) + + it('length of events array in return object should be no greater than 5', () => { + const actual = scoreEventStream(eventStream); + + expect(actual.events.length).toBeLessThanOrEqual(5); + }) + + it('should return an object whos events property is the expected test region', () => { + const actual = scoreEventStream(eventStream.slice(0,4)); + const expected = eventStream.slice(0,4) + + expect(actual.events).toEqual(expected); + }) + + it('should return an object with the cumulative score of the region as the score property', () => { + const expected = 7; + + const actual = scoreEventStream(eventStream.slice(0,5)); + + expect(actual.score).toEqual(expected); }) -}) \ No newline at end of file +}) diff --git a/src/index.ts b/src/index.ts index 0f72543..3479b13 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,72 @@ -//Define class/functions here +import { event, eventWithScore, scored_region } from './models' + +function addScoresToEvents(eventStream: ReadonlyArray) { + const eventsWithScores = eventStream.map(event => { + if (event.eventType === "newMessage") { + return { + ...event, + score: 1 + } + } else if (event.eventType === "view") { + return { + ...event, + score: 2 + } + } else { + return { + ...event, + score: 3 + } + } + }) + return eventsWithScores; +} + +function findHighestSCore(scores: ReadonlyArray) { + let highest_score = 0; + for (let i = 1; i <= scores.length; i++) { + if (scores[i] > scores[i - 1]) { + highest_score = scores[i] + } else { + + } + } + return highest_score; +} + +function separateSubRegions(eventStreamWithScores: ReadonlyArray, subRegionLength: number) { + const container: scored_region[] = []; + for (let i = 0; i <= eventStreamWithScores.length - subRegionLength; i++) { + const events_arr = eventStreamWithScores.slice(i, i + subRegionLength); + const event = { + events: events_arr, + score: Object.values(events_arr).map(e => { return e.score }).reduce((a, b) => { return a + b }) + } + container.push(event); + } + return container; +} + +function createScoresArray(eventStreamWithScores: ReadonlyArray | ReadonlyArray) { + return eventStreamWithScores.map(e => { return e.score }) +} + +export function scoreEventStream(eventStream: ReadonlyArray, subRegionLength: number = 5) { + if (eventStream.length <= subRegionLength) { + const eventsWithScores = addScoresToEvents(eventStream); + console.log(eventsWithScores); + const score = Object.values(eventsWithScores).map(e => { return e.score }).reduce((a, b) => { return a + b }) + return { + events: eventStream, + score: score + } + } else { + const eventsWithScores = addScoresToEvents(eventStream); + const container = separateSubRegions(eventsWithScores, subRegionLength); + const scores = createScoresArray(container); + const highest_score = findHighestSCore(scores); + const subRegionWithHighestScore = container.filter(e => e.score === highest_score)[0]; + return subRegionWithHighestScore; + } +} + diff --git a/src/models.ts b/src/models.ts new file mode 100644 index 0000000..02b248b --- /dev/null +++ b/src/models.ts @@ -0,0 +1,13 @@ +export interface event { + timestamp: number, + eventType: string +} + +export interface eventWithScore extends event { + score: number +} + +export interface scored_region { + events: ReadonlyArray, + score: number +} \ No newline at end of file diff --git a/src/test_data.ts b/src/test_data.ts new file mode 100644 index 0000000..129f456 --- /dev/null +++ b/src/test_data.ts @@ -0,0 +1,39 @@ +export const eventStream = +[ + { + 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: "newMessage", + } +]