Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Typescript utilities for working with rock climbing grades.
- [x] Saxon
- [x] Brazilian
- [x] Norwegian
- [x] Swedish

**Bouldering**

Expand Down
1 change: 1 addition & 0 deletions src/GradeScale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export const GradeScales = {
EWBANK: 'ewbank',
SAXON: 'saxon',
NORWEGIAN: 'norwegian',
SWEDISH: 'swedish',
BRAZILIAN_CRUX: 'brazilian_crux'
} as const

Expand Down
129 changes: 129 additions & 0 deletions src/__tests__/scales/swedish.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import { GradeBands } from '../../GradeBands'
import { Swedish } from '../../scales'
import { Swedish as SwedishFromIndex } from '../../index'

describe('Swedish', () => {
describe('Get Score', () => {
test('9- > 4+', () => {
const lowGrade = Swedish.getScore('4+')
const highGrade = Swedish.getScore('9-')
expect(highGrade[0]).toBeGreaterThan(lowGrade[1])
})

test('6 > 5+', () => {
const highGrade = Swedish.getScore('6')
const lowGrade = Swedish.getScore('5+')
expect(highGrade[0]).toBeGreaterThan(lowGrade[1])
})

test('6+ > 6-', () => {
const highGrade = Swedish.getScore('6+')
const lowGrade = Swedish.getScore('6-')
expect(highGrade[0] < lowGrade[1] && highGrade[0] > lowGrade[0])
expect(highGrade[1]).toBeGreaterThan(lowGrade[1])
})

test('8- > 7/7+', () => {
const highGrade = Swedish.getScore('8-')
const lowGrade = Swedish.getScore('7/7+')
expect(highGrade[0] < lowGrade[1] && highGrade[0] > lowGrade[0])
if (lowGrade[1] !== undefined && highGrade[1] !== undefined) {
expect(highGrade[1]).toBeGreaterThan(lowGrade[1])
}
})

test('Slash grade provided', () => {
expect(Swedish.getScore('4-/4')).toStrictEqual([34, 37])
expect(Swedish.getScore('5/5+')).toStrictEqual([51, 55])
expect(Swedish.getScore('7+/8-')).toStrictEqual([73, 75])
expect(Swedish.getScore('7+/7')).toStrictEqual([73, 75])
})
})

describe('Is Type', () => {
test('valid Swedish grades', () => {
expect(Swedish.isType('1-')).toBe(true)
expect(Swedish.isType('6')).toBe(true)
expect(Swedish.isType('11+')).toBe(true)
expect(Swedish.isType('7+/8-')).toBe(true)
})

test('invalid Swedish grades', () => {
expect(Swedish.isType('V11')).toBe(false)
expect(Swedish.isType('+5')).toBe(false)
expect(Swedish.isType('12')).toBe(false)
expect(Swedish.isType('5/5+/6-')).toBe(false)
})
})

describe('Invalid grade format', () => {
jest.spyOn(console, 'warn').mockImplementation()
beforeEach(() => {
jest.clearAllMocks()
})
test('invalid plus modifier', () => {
const invalidGrade = Swedish.getScore('+5')
expect(console.warn).toHaveBeenCalledWith(
'Unexpected grade format: +5 for grade scale Swedish'
)
expect(invalidGrade).toEqual(-1)
})
test('invalid minus modifier', () => {
const invalidGrade = Swedish.getScore('-5')
expect(console.warn).toHaveBeenCalledWith(
'Unexpected grade format: -5 for grade scale Swedish'
)
expect(invalidGrade).toEqual(-1)
})
test('extra slash grade', () => {
const invalidGrade = Swedish.getScore('5/5+/6-')
expect(console.warn).toHaveBeenCalledWith(
'Unexpected grade format: 5/5+/6- for grade scale Swedish'
)
expect(invalidGrade).toEqual(-1)
})
test('not Swedish scale', () => {
const invalidGrade = Swedish.getScore('V11')
expect(console.warn).toHaveBeenCalledWith(
'Unexpected grade format: V11 for grade scale Swedish'
)
expect(invalidGrade).toEqual(-1)
})
})

describe('Get Grade', () => {
test('bottom of range', () => {
expect(Swedish.getGrade(0)).toBe('1-')
})

test('top of range', () => {
expect(Swedish.getGrade(1000)).toBe('11+')
})

test('single score provided', () => {
expect(Swedish.getGrade(25)).toBe('3')
expect(Swedish.getGrade(30)).toBe('3+')
expect(Swedish.getGrade(48)).toBe('5-')
expect(Swedish.getGrade(55)).toBe('5+')
})
test('non-integer score rounds up', () => {
expect(Swedish.getGrade(24.5)).toBe(Swedish.getGrade(25))
})
test('exported from package index', () => {
expect(SwedishFromIndex).toBe(Swedish)
})
test('range of scores provided', () => {
expect(Swedish.getGrade([43, 44])).toBe('4+')
expect(Swedish.getGrade([71, 72])).toBe('7/7+')
expect(Swedish.getGrade([12, 15])).toBe('2-/2')
expect(Swedish.getGrade([44, 55])).toBe('4+/5+')
})
})

describe('Get Grade Band', () => {
test('gets Gradeband', () => {
expect(Swedish.getGradeBand('1')).toEqual(GradeBands.BEGINNER)
expect(Swedish.getGradeBand('10')).toEqual(GradeBands.EXPERT)
})
})
})
218 changes: 109 additions & 109 deletions src/data/routes.csv
Original file line number Diff line number Diff line change
@@ -1,109 +1,109 @@
score,yds,french,uiaa,ewbank,saxon,norwegian,brazilian_crux
0,5.0,1a,1,1,1,1-,I
1,5.0,1a,1,1,1,1-,I
2,5.0,1a+,1,1,1,1-,I
3,5.0,1a+,1,1,1,1-,I
4,5.0,1b,1,1,1,1,I
5,5.0,1b,1,2,1,1,I
6,5.0,1b+,1,2,1,1+,I
7,5.0,1b+,1,2,1,1+,I
8,5.0,1c,1,2,1,1+,Isup
9,5.0,1c,1,2,1,1+,Isup
10,5.0,1c+,1,3,1,2-,Isup
11,5,1c+,1,4,1,2-,Isup
12,5.1,2a,2,5,2,2,Isup
13,5.1,2a,2,5,2,2,Isup
14,5.1,2a+,2,5,2,2,II
15,5.1,2a+,2,6,2,2,II
16,5.1,2b,2,6,2,2+,II
17,5.1,2b,2,6,2,2+,II
18,5.2,2b+,2,7,2,2+,II
19,5.2,2b+,2,7,2,2+,II
20,5.2,2c,2,7,2,3-,II
21,5.2,2c,2,7,2,3-,II
22,5.3,2c+,2,8,2,3,IIsup
23,5.3,2c+,2,8,2,3,IIsup
24,5.3,3a,3,9,3,3,IIsup
25,5.3,3a,3,9,3,3,IIsup
26,5.4,3a+,3,10,3,3+,IIsup
27,5.4,3a+,3,10,3,3+,IIsup
28,5.4,3b,3,10,3,3+,III
29,5.4,3b,3,10,3,3+,III
30,5.4,3b+,3,10,3,4-,III
31,5.5,3b+,3,11,3,4-,III
32,5.5,3c,3,11,3,4,III
33,5.5,3c,3,12,3,4,III
34,5.5,3c+,3,12,3,4,III
35,5.5,3c+,3,12,3,4,III
36,5.6,4a,4,13,4,4+,IIIsup
37,5.6,4a,4,13,4,4+,IIIsup
38,5.6,4a+,4+,13,4,4+,IIIsup
39,5.6,4a+,4+,13,4,4+,IIIsup
40,5.6,4b,4+,13,5,5-,IIIsup
41,5.7,4b,4+,14,5,5-,IIIsup
42,5.7,4b+,5-,14,5,5-,IV
43,5.7,4b+,5-,14,5,5-,IV
44,5.7,4c,5-,15,5,5,IV
45,5.7,4c,5-,15,5,5,IV
46,5.8,4c+,5,16,6,5,IV
47,5.8,4c+,5,16,6,5,IV
48,5.8,5a,5,16,7a,5+,IVsup
49,5.8,5a,5,16,7a,5+,IVsup
50,5.8,5a+,5+,16,7a,5+,IVsup
51,5.8,5a+,5+,16,7a,5+,IVsup
52,5.9,5b,5+,17,7a,5+,IVsup
53,5.9,5b,5+,17,7a,5+,IVsup
54,5.9,5b+,6-,17,7b,5+,IVsup
55,5.9,5b+,6-,17,7b,5+,IVsup
56,5.9,5c,6,17,7b,6-,V
57,5.10a,5c,6,18,7b,6-,V
58,5.10a,5c+,6+,18,7c,6-,V
59,5.10a,5c+,6+,18,7c,6-,V
60,5.10a,6a,6+,18,7c,6-,V
61,5.10a,6a,6+,18,7c,6-,V
62,5.10b,6a+,7-,19,8a,6,Vsup
63,5.10b,6a+,7-,19,8a,6,Vsup
64,5.10c,6b,7,20,8b,6,VI
65,5.10c,6b,7,20,8b,6,VI
66,5.10d,6b+,7+,20,8c,6+,VIsup
67,5.11a,6b+,7+,21,8c,6+,VIsup
68,5.11a,6c,7+/8-,21,9a,7-,VIIa
69,5.11b,6c,7+/8-,22,9a,7-,VIIa
70,5.11b,6c+,8-,22,9a,7,VIIb
71,5.11c,6c+,8-,23,9a,7,VIIb
72,5.11c,7a,8,23,9b,7+,VIIc
73,5.11d,7a,8,23,9b,7+,VIIc
74,5.11d,7a+,8+,24,9c,8-,VIIIa
75,5.12a,7a+,8+,24,9c,8-,VIIIa
76,5.12b,7b,8+/9-,25,10a,8-,VIIIb
77,5.12b,7b,8+/9-,25,10a,8-,VIIIb
78,5.12c,7b+,9-,26,10a,8,VIIIc
79,5.12c,7b+,9-,26,10a,8,VIIIc
80,5.12d,7c,9,27,10b,8+,IXa
81,5.12d,7c,9,27,10b,8+,IXa
82,5.13a,7c+,9+,28,10c,8+,IXb
83,5.13a,7c+,9+,28,10c,8+,IXb
84,5.13b,8a,10-,29,10c,9-,IXc
85,5.13b,8a,10-,29,10c,9-,IXc
86,5.13c,8a+,10,30,11b,9-,Xa
87,5.13c,8a+,10,30,11b,9-,Xa
88,5.13d,8b,10+,31,11c,9,Xb
89,5.13d,8b,10+,31,11c,9,Xb
90,5.14a,8b+,10+/11-,32,11c,9+,Xc
91,5.14a,8b+,10+/11-,32,11c,9+,Xc
92,5.14b,8c,11-,33,12a,9+,XIa
93,5.14b,8c,11-,33,12a,9+,XIa
94,5.14c,8c+,11,34,12b,10-,XIb
95,5.14c,8c+,11,34,12b,10-,XIb
96,5.14d,9a,11,35,12c,10,XIc
97,5.14d,9a,11,35,12c,10,XIc
98,5.15a,9a+,11/11+,36,13a,10+,XIIa
99,5.15a,9a+,11/11+,36,13a,10+,XIIa
100,5.15b,9b,11+,37,13b,10+,XIIb
101,5.15b,9b,11+,37,13b,10+,XIIb
102,5.15c,9b+,11+/12-,38,13b,11-,XIIc
103,5.15c,9b+,11+/12-,38,13b,11-,XIIc
104,5.15d,9c,12-,39,13c,11,XIIIa
105,5.15d,9c,12-,39,13c,11,XIIIb
106,5.16a,9c+,12,40,13c,11+,XIIIc
107,5.16a,9c+,12,40,13c,11+,XIVa
score,yds,french,uiaa,ewbank,saxon,norwegian,swedish,brazilian_crux
0,5.0,1a,1,1,1,1-,1-,I
1,5.0,1a,1,1,1,1-,1-,I
2,5.0,1a+,1,1,1,1-,1-,I
3,5.0,1a+,1,1,1,1-,1-,I
4,5.0,1b,1,1,1,1,1,I
5,5.0,1b,1,2,1,1,1,I
6,5.0,1b+,1,2,1,1+,1,I
7,5.0,1b+,1,2,1,1+,1+,I
8,5.0,1c,1,2,1,1+,1+,Isup
9,5.0,1c,1,2,1,1+,1+,Isup
10,5.0,1c+,1,3,1,2-,1+,Isup
11,5,1c+,1,4,1,2-,2-,Isup
12,5.1,2a,2,5,2,2,2-,Isup
13,5.1,2a,2,5,2,2,2-,Isup
14,5.1,2a+,2,5,2,2,2,II
15,5.1,2a+,2,6,2,2,2,II
16,5.1,2b,2,6,2,2+,2,II
17,5.1,2b,2,6,2,2+,2,II
18,5.2,2b+,2,7,2,2+,2+,II
19,5.2,2b+,2,7,2,2+,2+,II
20,5.2,2c,2,7,2,3-,2+,II
21,5.2,2c,2,7,2,3-,2+,II
22,5.3,2c+,2,8,2,3,3-,IIsup
23,5.3,2c+,2,8,2,3,3-,IIsup
24,5.3,3a,3,9,3,3,3-,IIsup
25,5.3,3a,3,9,3,3,3,IIsup
26,5.4,3a+,3,10,3,3+,3,IIsup
27,5.4,3a+,3,10,3,3+,3,IIsup
28,5.4,3b,3,10,3,3+,3,III
29,5.4,3b,3,10,3,3+,3+,III
30,5.4,3b+,3,10,3,4-,3+,III
31,5.5,3b+,3,11,3,4-,3+,III
32,5.5,3c,3,11,3,4,4-,III
33,5.5,3c,3,12,3,4,4-,III
34,5.5,3c+,3,12,3,4,4-,III
35,5.5,3c+,3,12,3,4,4-,III
36,5.6,4a,4,13,4,4+,4,IIIsup
37,5.6,4a,4,13,4,4+,4,IIIsup
38,5.6,4a+,4+,13,4,4+,4,IIIsup
39,5.6,4a+,4+,13,4,4+,4,IIIsup
40,5.6,4b,4+,13,5,5-,4+,IIIsup
41,5.7,4b,4+,14,5,5-,4+,IIIsup
42,5.7,4b+,5-,14,5,5-,4+,IV
43,5.7,4b+,5-,14,5,5-,4+,IV
44,5.7,4c,5-,15,5,5,4+,IV
45,5.7,4c,5-,15,5,5,5-,IV
46,5.8,4c+,5,16,6,5,5-,IV
47,5.8,4c+,5,16,6,5,5-,IV
48,5.8,5a,5,16,7a,5+,5-,IVsup
49,5.8,5a,5,16,7a,5+,5,IVsup
50,5.8,5a+,5+,16,7a,5+,5,IVsup
51,5.8,5a+,5+,16,7a,5+,5,IVsup
52,5.9,5b,5+,17,7a,5+,5,IVsup
53,5.9,5b,5+,17,7a,5+,5+,IVsup
54,5.9,5b+,6-,17,7b,5+,5+,IVsup
55,5.9,5b+,6-,17,7b,5+,5+,IVsup
56,5.9,5c,6,17,7b,6-,5+,V
57,5.10a,5c,6,18,7b,6-,5+,V
58,5.10a,5c+,6+,18,7c,6-,6-,V
59,5.10a,5c+,6+,18,7c,6-,6-,V
60,5.10a,6a,6+,18,7c,6-,6-,V
61,5.10a,6a,6+,18,7c,6-,6-,V
62,5.10b,6a+,7-,19,8a,6,6,Vsup
63,5.10b,6a+,7-,19,8a,6,6,Vsup
64,5.10c,6b,7,20,8b,6,6,VI
65,5.10c,6b,7,20,8b,6,6+,VI
66,5.10d,6b+,7+,20,8c,6+,6+,VIsup
67,5.11a,6b+,7+,21,8c,6+,7-,VIsup
68,5.11a,6c,7+/8-,21,9a,7-,7-,VIIa
69,5.11b,6c,7+/8-,22,9a,7-,7-,VIIa
70,5.11b,6c+,8-,22,9a,7,7,VIIb
71,5.11c,6c+,8-,23,9a,7,7,VIIb
72,5.11c,7a,8,23,9b,7+,7+,VIIc
73,5.11d,7a,8,23,9b,7+,7+,VIIc
74,5.11d,7a+,8+,24,9c,8-,7+,VIIIa
75,5.12a,7a+,8+,24,9c,8-,8-,VIIIa
76,5.12b,7b,8+/9-,25,10a,8-,8-,VIIIb
77,5.12b,7b,8+/9-,25,10a,8-,8,VIIIb
78,5.12c,7b+,9-,26,10a,8,8,VIIIc
79,5.12c,7b+,9-,26,10a,8,8,VIIIc
80,5.12d,7c,9,27,10b,8+,8+,IXa
81,5.12d,7c,9,27,10b,8+,8+,IXa
82,5.13a,7c+,9+,28,10c,8+,8+,IXb
83,5.13a,7c+,9+,28,10c,8+,9-,IXb
84,5.13b,8a,10-,29,10c,9-,9-,IXc
85,5.13b,8a,10-,29,10c,9-,9-,IXc
86,5.13c,8a+,10,30,11b,9-,9,Xa
87,5.13c,8a+,10,30,11b,9-,9,Xa
88,5.13d,8b,10+,31,11c,9,9,Xb
89,5.13d,8b,10+,31,11c,9,9+,Xb
90,5.14a,8b+,10+/11-,32,11c,9+,9+,Xc
91,5.14a,8b+,10+/11-,32,11c,9+,9+,Xc
92,5.14b,8c,11-,33,12a,9+,10-,XIa
93,5.14b,8c,11-,33,12a,9+,10-,XIa
94,5.14c,8c+,11,34,12b,10-,10,XIb
95,5.14c,8c+,11,34,12b,10-,10,XIb
96,5.14d,9a,11,35,12c,10,10,XIc
97,5.14d,9a,11,35,12c,10,10+,XIc
98,5.15a,9a+,11/11+,36,13a,10+,10+,XIIa
99,5.15a,9a+,11/11+,36,13a,10+,10+,XIIa
100,5.15b,9b,11+,37,13b,10+,11-,XIIb
101,5.15b,9b,11+,37,13b,10+,11-,XIIb
102,5.15c,9b+,11+/12-,38,13b,11-,11-,XIIc
103,5.15c,9b+,11+/12-,38,13b,11-,11,XIIc
104,5.15d,9c,12-,39,13c,11,11,XIIIa
105,5.15d,9c,12-,39,13c,11,11,XIIIb
106,5.16a,9c+,12,40,13c,11+,11+,XIIIc
107,5.16a,9c+,12,40,13c,11+,11+,XIVa
Loading
Loading