From 47f54f5000b67f4a769c6820e9756a321e5b6132 Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Thu, 24 Aug 2023 15:43:49 -0700 Subject: [PATCH 1/6] write failing tests --- src/index.test.ts | 52 ++++++++++++-- src/index.ts | 17 ++++- src/test_data.ts | 180 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+), 5 deletions(-) create mode 100644 src/test_data.ts diff --git a/src/index.test.ts b/src/index.test.ts index f3b13a9..b1e1dd1 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,7 +1,51 @@ -//write tests here +import { eventStream, region1, region2, region3, region4, eventStreamWithScores } 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', () => { + const actual = scoreEventStream(eventStream); + + expect(actual).toHaveProperty("events"); + }) + + it('should return an object with a score property', () => { + const actual = scoreEventStream(eventStream); + + expect(actual).toHaveProperty("score"); + }) + + it('successfully assess the length of the inputted array', () => { + const expected = 5; + + const actual = scoreEventStream(eventStream); + + expect(actual).toEqual(expected); + }) + + it('should return an object whos events property is the expected test region', () => { + const expected = { + events: region1, + score: 0 + } + + const actual = scoreEventStream(region1); + + expect(actual).toEqual(expected); + }) + + it('should return an immutable copy of the eventStream where each event has a new score property', () => { + const expected = eventStreamWithScores; + + const actual = scoreEventStream(eventStream); + + expect(actual).toEqual(expected); + }) + + it('should return an object with the cumulative score of the region as the score property', () => { + const expected = 7; + + const actual = scoreEventStream(region1); + + expect(actual).toEqual(expected); }) }) \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 0f72543..2930244 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,16 @@ -//Define class/functions here +type event = { + timestamp: number, + eventType: string +} + +type highest_score = { + events: ReadonlyArray, + score: number +} + +export function scoreEventStream(eventStream: ReadonlyArray): highest_score { + return { + events: [], + score: 0 + } +} \ No newline at end of file diff --git a/src/test_data.ts b/src/test_data.ts new file mode 100644 index 0000000..2ce9a06 --- /dev/null +++ b/src/test_data.ts @@ -0,0 +1,180 @@ +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", + } +] + +export const eventStreamWithScores = +[ + { + timestamp: 123123123, + eventType: "newMessage", + score: 1 + }, + { + timestamp: 123123124, + eventType: "newMessage", + score: 1 + }, + { + timestamp: 123123125, + eventType: "newMessage", + score: 1 + }, + { + timestamp: 123123125, + eventType: "view", + score: 2 + }, + { + timestamp: 123123125, + eventType: "view", + score: 2 + }, + { + timestamp: 123123125, + eventType: "screenshot", + score: 3 + }, + { + timestamp: 123123125, + eventType: "screenshot", + score: 3 + }, + { + timestamp: 123123125, + eventType: "newMessage", + score: 3 + }, + { + timestamp: 123123125, + eventType: "newMessage", + score: 3 + } +] + +export const region1 = [ + { + timestamp: 123123123, + eventType: "newMessage" + }, + { + timestamp: 123123124, + eventType: "newMessage" + }, + { + timestamp: 123123125, + eventType: "newMessage" + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "view", + } +] + +export const region2 = [ + { + timestamp: 123123124, + eventType: "newMessage" + }, + { + timestamp: 123123125, + eventType: "newMessage" + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "screenshot", + } +] + +export const region3 = [ + { + timestamp: 123123125, + eventType: "newMessage" + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "view", + }, + { + timestamp: 123123125, + eventType: "screenshot", + }, + { + timestamp: 123123125, + eventType: "screenshot", + } +] + +export const region4 = [ + { + 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 From 11f5582ff88a05443c4b8139abb8f6215ce276d5 Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Thu, 24 Aug 2023 15:49:14 -0700 Subject: [PATCH 2/6] add lines to assuage github lint --- src/index.test.ts | 4 ++-- src/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.test.ts b/src/index.test.ts index b1e1dd1..e2e20d1 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -13,7 +13,7 @@ describe('scoreEventStream', () => { expect(actual).toHaveProperty("score"); }) - + it('successfully assess the length of the inputted array', () => { const expected = 5; @@ -48,4 +48,4 @@ describe('scoreEventStream', () => { expect(actual).toEqual(expected); }) -}) \ No newline at end of file +}) diff --git a/src/index.ts b/src/index.ts index 2930244..746db67 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,4 +13,4 @@ export function scoreEventStream(eventStream: ReadonlyArray): highest_sco events: [], score: 0 } -} \ No newline at end of file +} From 6539f330d5f4f81b37f0d89fd3e1e2bbba14972b Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Thu, 24 Aug 2023 16:44:36 -0700 Subject: [PATCH 3/6] move interfaces in to models folder --- src/models.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/models.ts diff --git a/src/models.ts b/src/models.ts new file mode 100644 index 0000000..334c57a --- /dev/null +++ b/src/models.ts @@ -0,0 +1,9 @@ +export interface event { + timestamp: number, + eventType: string +} + +export interface highest_score { + events: ReadonlyArray, + score: number +} \ No newline at end of file From a1293a42edbb24ba5098d96924194facbba5a0d6 Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Thu, 24 Aug 2023 16:45:05 -0700 Subject: [PATCH 4/6] clean up code and refactor useless tests --- src/index.test.ts | 32 ++--------- src/index.ts | 10 +--- src/test_data.ts | 141 ---------------------------------------------- 3 files changed, 7 insertions(+), 176 deletions(-) diff --git a/src/index.test.ts b/src/index.test.ts index e2e20d1..fe6d17c 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1,50 +1,30 @@ -import { eventStream, region1, region2, region3, region4, eventStreamWithScores } from './test_data'; +import { eventStream } from './test_data'; import { scoreEventStream } from '.'; describe('scoreEventStream', () => { - it('should return an object with an events property', () => { + it('should return an object with an events property and a score property', () => { const actual = scoreEventStream(eventStream); expect(actual).toHaveProperty("events"); - }) - - it('should return an object with a score property', () => { - const actual = scoreEventStream(eventStream); - expect(actual).toHaveProperty("score"); }) - it('successfully assess the length of the inputted array', () => { - const expected = 5; - + it('length of events array in return object should be no greater than 5', () => { const actual = scoreEventStream(eventStream); - expect(actual).toEqual(expected); + expect(actual.events.length).toBeLessThanOrEqual(5); }) it('should return an object whos events property is the expected test region', () => { - const expected = { - events: region1, - score: 0 - } - - const actual = scoreEventStream(region1); - - expect(actual).toEqual(expected); - }) - - it('should return an immutable copy of the eventStream where each event has a new score property', () => { - const expected = eventStreamWithScores; - const actual = scoreEventStream(eventStream); - expect(actual).toEqual(expected); + expect(actual.events).toEqual(eventStream.slice(0,4)); }) it('should return an object with the cumulative score of the region as the score property', () => { const expected = 7; - const actual = scoreEventStream(region1); + const actual = scoreEventStream(eventStream.slice(0,4)); expect(actual).toEqual(expected); }) diff --git a/src/index.ts b/src/index.ts index 746db67..b7689a6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,4 @@ -type event = { - timestamp: number, - eventType: string -} - -type highest_score = { - events: ReadonlyArray, - score: number -} +import { event, highest_score } from './models' export function scoreEventStream(eventStream: ReadonlyArray): highest_score { return { diff --git a/src/test_data.ts b/src/test_data.ts index 2ce9a06..129f456 100644 --- a/src/test_data.ts +++ b/src/test_data.ts @@ -37,144 +37,3 @@ export const eventStream = eventType: "newMessage", } ] - -export const eventStreamWithScores = -[ - { - timestamp: 123123123, - eventType: "newMessage", - score: 1 - }, - { - timestamp: 123123124, - eventType: "newMessage", - score: 1 - }, - { - timestamp: 123123125, - eventType: "newMessage", - score: 1 - }, - { - timestamp: 123123125, - eventType: "view", - score: 2 - }, - { - timestamp: 123123125, - eventType: "view", - score: 2 - }, - { - timestamp: 123123125, - eventType: "screenshot", - score: 3 - }, - { - timestamp: 123123125, - eventType: "screenshot", - score: 3 - }, - { - timestamp: 123123125, - eventType: "newMessage", - score: 3 - }, - { - timestamp: 123123125, - eventType: "newMessage", - score: 3 - } -] - -export const region1 = [ - { - timestamp: 123123123, - eventType: "newMessage" - }, - { - timestamp: 123123124, - eventType: "newMessage" - }, - { - timestamp: 123123125, - eventType: "newMessage" - }, - { - timestamp: 123123125, - eventType: "view", - }, - { - timestamp: 123123125, - eventType: "view", - } -] - -export const region2 = [ - { - timestamp: 123123124, - eventType: "newMessage" - }, - { - timestamp: 123123125, - eventType: "newMessage" - }, - { - timestamp: 123123125, - eventType: "view", - }, - { - timestamp: 123123125, - eventType: "view", - }, - { - timestamp: 123123125, - eventType: "screenshot", - } -] - -export const region3 = [ - { - timestamp: 123123125, - eventType: "newMessage" - }, - { - timestamp: 123123125, - eventType: "view", - }, - { - timestamp: 123123125, - eventType: "view", - }, - { - timestamp: 123123125, - eventType: "screenshot", - }, - { - timestamp: 123123125, - eventType: "screenshot", - } -] - -export const region4 = [ - { - 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 From b42fe607433121f8303bafe1c30c3e7504ff8705 Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Fri, 25 Aug 2023 16:27:59 -0700 Subject: [PATCH 5/6] write function to pass tests --- src/index.test.ts | 9 ++--- src/index.ts | 84 ++++++++++++++++++++++++++++++++++++++++++++--- src/models.ts | 6 +++- 3 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/index.test.ts b/src/index.test.ts index fe6d17c..c11c427 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -16,16 +16,17 @@ describe('scoreEventStream', () => { }) it('should return an object whos events property is the expected test region', () => { - const actual = scoreEventStream(eventStream); + const actual = scoreEventStream(eventStream.slice(0,4)); + const expected = eventStream.slice(0,4) - expect(actual.events).toEqual(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,4)); + const actual = scoreEventStream(eventStream.slice(0,5)); - expect(actual).toEqual(expected); + expect(actual.score).toEqual(expected); }) }) diff --git a/src/index.ts b/src/index.ts index b7689a6..5aca6e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,82 @@ -import { event, highest_score } from './models' +import { event, eventWithScore, scored_region } from './models' -export function scoreEventStream(eventStream: ReadonlyArray): highest_score { - return { - events: [], - score: 0 +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 { + + //map through array and add scores + const eventsWithScores = addScoresToEvents(eventStream); + console.log(eventsWithScores) + + + //loop through array with scores and separate out subregions, save those into an object + const container = separateSubRegions(eventsWithScores, subRegionLength); + //create array of scores, and loop through to find the highest score + 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 index 334c57a..02b248b 100644 --- a/src/models.ts +++ b/src/models.ts @@ -3,7 +3,11 @@ export interface event { eventType: string } -export interface highest_score { +export interface eventWithScore extends event { + score: number +} + +export interface scored_region { events: ReadonlyArray, score: number } \ No newline at end of file From 6be000054b0747474d47c1b866c4c521be5026b7 Mon Sep 17 00:00:00 2001 From: Sarah Reimann Date: Fri, 25 Aug 2023 16:28:50 -0700 Subject: [PATCH 6/6] clean up code --- src/index.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index 5aca6e8..3479b13 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,7 +52,6 @@ function createScoresArray(eventStreamWithScores: ReadonlyArray | } export function scoreEventStream(eventStream: ReadonlyArray, subRegionLength: number = 5) { - if (eventStream.length <= subRegionLength) { const eventsWithScores = addScoresToEvents(eventStream); console.log(eventsWithScores); @@ -62,20 +61,11 @@ export function scoreEventStream(eventStream: ReadonlyArray, subRegionLen score: score } } else { - - //map through array and add scores const eventsWithScores = addScoresToEvents(eventStream); - console.log(eventsWithScores) - - - //loop through array with scores and separate out subregions, save those into an object const container = separateSubRegions(eventsWithScores, subRegionLength); - //create array of scores, and loop through to find the highest score const scores = createScoresArray(container); const highest_score = findHighestSCore(scores); - const subRegionWithHighestScore = container.filter(e => e.score === highest_score)[0]; - return subRegionWithHighestScore; } }