diff --git a/src/index.test.ts b/src/index.test.ts index 939df3a..71ba0d4 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,5 +1,5 @@ -//write tests here -import { CustomError, UserAPI } from "./index" +// //write tests here +import { CustomError, EventScoreAPI, UserAPI } from "./index" describe('Tests will go here!', () => { let users: UserAPI @@ -223,4 +223,174 @@ describe('Tests will go here!', () => { } }) }) - \ No newline at end of file + +describe('EventScore API', () => { + it('Returns an entire array if it is five events or less', () => { + const events = new EventScoreAPI([ + { + timestamp: 123123123, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + ]) + + const result = events.calcHighestScoreArrSequence() + + expect(result).toStrictEqual([ + { + timestamp: 123123123, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + ]) + }) + + it('Returns an empty array if there are no events', () => { + const events = new EventScoreAPI([]) + + const result = events.calcHighestScoreArrSequence() + + expect(result).toStrictEqual([]) + }) + + it('Returns an array of five events if the array length is five', () => { + const events = new EventScoreAPI([ + { + timestamp: 123123123, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + ]) + + const result = events.calcHighestScoreArrSequence() + + expect(result).toStrictEqual([ + { + timestamp: 123123123, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + ]) + }) + + it('Returns a subarray - no greater than 5 contiguous elements - where the total event type score is the highest', () => { + const events = new EventScoreAPI([ + { + timestamp: 123123123, + eventType: "new message", + }, + { + timestamp: 123123124, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "new message", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + ]) + const result = events.calcHighestScoreArrSequence() + + expect(result).toStrictEqual([ + { + timestamp: 123123124, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + ]) + }) +}) diff --git a/src/index.ts b/src/index.ts index 6c95134..bd5c4bc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -//Define class here +// Define class here export interface User { readonly id?: number @@ -82,3 +82,62 @@ export class UserAPI { } } } + +// +// +// EVENT API + +export interface Event { + readonly timestamp: number + readonly eventType: "new message" | "view" | "screenshot" +} + +export class EventScoreAPI { + private score: number + private eventArr: ReadonlyArray + + constructor(eventArr: ReadonlyArray) { + this.eventArr = eventArr + this.score = 0 + } + + public calcHighestScoreArrSequence = (): ReadonlyArray => { + let tempCount: number = 0 + let highestScoreArr: ReadonlyArray = [] + + if (this.eventArr.length <= 5) { + return this.eventArr + } else { + this.eventArr.forEach((event, i) => { + const { eventType } = event + + if (eventType === "screenshot") { + tempCount += 3 + } else if (eventType === "view") { + tempCount += 2 + } else { + tempCount += 1 + } + + if (i > 4) { + const eventTypeToSubtract = this.eventArr[i - 5].eventType + + if (eventTypeToSubtract === "screenshot") { + tempCount -= 3 + } else if (eventTypeToSubtract === "view") { + tempCount -= 2 + } else { + tempCount -= 1 + } + } + + if (tempCount > this.score) { + this.score = tempCount + highestScoreArr = this.eventArr.slice(i - 4, i + 1) + return highestScoreArr + } + }) + } + return highestScoreArr + } +}