Skip to content

Commit

Permalink
chore: some refactoring and new tests (#177)
Browse files Browse the repository at this point in the history
* chore: removed old service

* chore: added wallabyjs to container

* feat: env in dev container

* feat: vitest plugin with cool coverage ui

* chore: some more tests, refactoring

* fix: date tests
  • Loading branch information
hmbanan666 authored Jun 22, 2024
1 parent 7c8fd4f commit 2f8aecb
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 24 deletions.
Empty file added .devcontainer/devcontainer.env
Empty file.
8 changes: 6 additions & 2 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"name": "Chat Game",
"service": "app",
"image": "mcr.microsoft.com/devcontainers/typescript-node:20",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",

Expand All @@ -19,11 +18,16 @@
"vscode": {
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"dbaeumer.vscode-eslint"
"dbaeumer.vscode-eslint",
"svelte.svelte-vscode",
"ms-azuretools.vscode-docker",
"vitest.explorer"
]
}
},

"runArgs": ["--env-file", ".devcontainer/devcontainer.env"],

"portsAttributes": {
"3000": {
"label": "Application",
Expand Down
18 changes: 9 additions & 9 deletions src/lib/utils/__tests__/date.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ describe('getDatePlusMinutes()', () => {
const minutesToAdd = 5
const result = getDatePlusMinutes(minutesToAdd)
const expected = new Date(now.getTime() + minutesToAdd * 60 * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})

it('handles the edge case of zero minutes', () => {
const now = new Date()
const result = getDatePlusMinutes(0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 2)
})

it('handles the edge case of negative minutes', () => {
const now = new Date()
const minutesToAdd = -5
const result = getDatePlusMinutes(minutesToAdd)
const expected = new Date(now.getTime() + minutesToAdd * 60 * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})
})

Expand All @@ -31,21 +31,21 @@ describe('getDateMinusMinutes()', () => {
const minutesToSubtract = 5
const result = getDateMinusMinutes(minutesToSubtract)
const expected = new Date(now.getTime() - minutesToSubtract * 60 * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})

it('handles the edge case of zero minutes', () => {
const now = new Date()
const result = getDateMinusMinutes(0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 2)
})

it('handles the edge case of negative minutes', () => {
const now = new Date()
const minutesToSubtract = -5
const result = getDateMinusMinutes(minutesToSubtract)
const expected = new Date(now.getTime() - minutesToSubtract * 60 * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})
})

Expand All @@ -55,20 +55,20 @@ describe('getDatePlusSeconds()', () => {
const secondsToAdd = 5
const result = getDatePlusSeconds(secondsToAdd)
const expected = new Date(now.getTime() + secondsToAdd * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})

it('handles the edge case of zero seconds', () => {
const now = new Date()
const result = getDatePlusSeconds(0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 0)
expect(result.getTime()).toBeCloseTo(now.getTime(), 2)
})

it('handles the edge case of negative seconds', () => {
const now = new Date()
const secondsToAdd = -5
const result = getDatePlusSeconds(secondsToAdd)
const expected = new Date(now.getTime() + secondsToAdd * 1000)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 0)
expect(result.getTime()).toBeCloseTo(expected.getTime(), 2)
})
})
10 changes: 10 additions & 0 deletions src/lib/utils/__tests__/locale.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,14 @@ describe('pluralizationRu()', () => {
const result = pluralizationRu(-3, ['яблоко', 'яблока', 'яблок'])
expect(result).toBe('яблока')
})

it('handles the edge case of 101 - 110', () => {
const result = pluralizationRu(102, ['яблоко', 'яблока', 'яблок'])
expect(result).toBe('яблока')
})

it('handles the edge case of 124', () => {
const result = pluralizationRu(124, ['яблоко', 'яблока', 'яблок'])
expect(result).toBe('яблока')
})
})
11 changes: 10 additions & 1 deletion src/lib/utils/__tests__/random.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest'
import { getRandomInRange } from '$lib/utils/random'
import { getMinusOrPlus, getRandomInRange } from '$lib/utils/random'

describe('getRandomInRange()', () => {
it('returns a number within the range', () => {
Expand All @@ -19,3 +19,12 @@ describe('getRandomInRange()', () => {
expect(result).toBeLessThanOrEqual(-1)
})
})

describe('getMinusOrPlus()', () => {
it('returns 1 or -1', () => {
const result = getMinusOrPlus()
expect(result).toBeGreaterThanOrEqual(-1)
expect(result).toBeLessThanOrEqual(1)
expect(result).not.toBe(0)
})
})
18 changes: 12 additions & 6 deletions src/lib/utils/locale.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
export function pluralizationRu(int: number, array: [string, string, string]): string {
const i = Math.abs(int)
const n = Math.abs(int)

return array[
i % 100 > 4 && i % 100 < 20
? 2
: [2, 0, 1, 1, 1, 2][i % 10 < 5 ? i % 10 : 5]
]
let idx
// @see http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html
if (n % 10 === 1 && n % 100 !== 11) {
idx = 0 // one
} else if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) {
idx = 1 // few
} else {
idx = 2 // many
}

return array[idx]
}
12 changes: 6 additions & 6 deletions src/routes/[lang]/(game)/play/GameEventTimer.svelte
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
<script lang='ts'>
import { onDestroy } from 'svelte'
export let endsAt: Date
const { endsAt }: { endsAt: Date } = $props()
const countdown = new Date(endsAt).getTime()
let now = Date.now()
const end = now + countdown
$: count = Math.round((end - now) / 1000)
$: h = Math.floor(count / 3600)
$: m = Math.floor((count - h * 3600) / 60)
$: s = count - h * 3600 - m * 60
const count = $state(Math.round((end - now) / 1000))
const h = $state(Math.floor(count / 3600))
const m = $state(Math.floor((count - h * 3600) / 60))
const s = $state(count - h * 3600 - m * 60)
function updateTimer() {
now = Date.now()
}
const interval = setInterval(updateTimer, 1000)
$: if (count === 0) {
if (count === 0) {
clearInterval(interval)
}
Expand Down

0 comments on commit 2f8aecb

Please sign in to comment.