diff --git a/src/assets/sampleData.ts b/src/assets/sampleData.ts new file mode 100644 index 0000000..bfbf984 --- /dev/null +++ b/src/assets/sampleData.ts @@ -0,0 +1,40 @@ +import { EventStream } from '../types'; + +export const sampleData: 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', + } +] \ No newline at end of file diff --git a/src/index.test.ts b/src/index.test.ts index f3b13a9..9ad7234 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,7 +1,39 @@ -//write tests here +import { AppEvent } from './types' +import { Region } from './models/region' +import { retrieveScoreByEventType } from './utils/utils' -describe('Tests will go here!', () => { - it('should pass', () => { - expect(true).toBeTruthy() +describe('Region', () => { + + const appEvent: AppEvent = + { + timestamp: 123123123, + eventType: 'newMessage', + } + + it('adds an AppEvent to a region', () => { + const region = new Region() + region.addAppEvent(appEvent) + expect(region.regionEvents.length).toEqual(1) + }) + + it('totals up the score of a region', () => { + const region = new Region() + region.addAppEvent(appEvent) + expect(region.getScore()).toEqual(1) + }) +}) + +describe('RetrieveScoreByEventType', () => { + + it('provides the correct score for event type: newMessage', () => { + expect(retrieveScoreByEventType('newMessage')).toEqual(1) + }) + + it('provides the correct score for event type: view', () => { + expect(retrieveScoreByEventType('view')).toEqual(2) + }) + + it('provides the correct score for event type: screenshot', () => { + expect(retrieveScoreByEventType('screenshot')).toEqual(3) }) }) \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index bb6b54e..41c166a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,5 @@ -//Define class here \ No newline at end of file +const main = () => { + console.log('main is running') +} + +main() \ No newline at end of file diff --git a/src/models/highestRegionLocator.ts b/src/models/highestRegionLocator.ts new file mode 100644 index 0000000..e4823c3 --- /dev/null +++ b/src/models/highestRegionLocator.ts @@ -0,0 +1,15 @@ +import { Region } from './region' +import { EventStream } from '../types' + +export class HighestRegionLocator { + eventStream: EventStream + + constructor(eventStream: EventStream) { + this.eventStream = eventStream + } + + locateHighestRegion(): Region { + throw console.error('This is not implemented yet') + return new Region() + } +} \ No newline at end of file diff --git a/src/models/region.ts b/src/models/region.ts new file mode 100644 index 0000000..1749eed --- /dev/null +++ b/src/models/region.ts @@ -0,0 +1,18 @@ +import { retrieveScoreByEventType } from '../utils/utils' +import { AppEvent } from '../types' + +export class Region { + regionEvents: AppEvent[] = [] + + addAppEvent(appEvent: AppEvent): void { + this.regionEvents.push(appEvent) + } + + getScore(): number { + let totalScore = 0 + for (let appEvent of this.regionEvents) { + totalScore += retrieveScoreByEventType(appEvent.eventType) + } + return totalScore + } +} \ No newline at end of file diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..b8968ce --- /dev/null +++ b/src/types.ts @@ -0,0 +1,10 @@ +export type AppEvent = { + timestamp: number, + eventType: string, +} + +export type EventStream = AppEvent[] + +export type ScoresDictionary = { + [index: string]: number, +} \ No newline at end of file diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..8b856d7 --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,11 @@ +import { ScoresDictionary } from '../types' + +const SCORES: ScoresDictionary = { + 'newMessage': 1, + 'view': 2, + 'screenshot': 3 +} + +export const retrieveScoreByEventType = (eventType: string): number => { + return SCORES[eventType] +} \ No newline at end of file