-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfleb.test.ts
209 lines (176 loc) · 7.65 KB
/
fleb.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
import {
parseName,
parseGrid,
parseQsoQslMsg,
printAdif,
parseCall,
parseTime,
parseMode,
parseNick,
detectband,
parseSTX,
parseSRX,
makeJsonArray,
parseSotaref,
parsePotaref,
parseQsoComment
} from "./src/fleb";
import {parse} from "@babel/core";
const FLE_ADIF_HEADER = "ADIF Export for Fast Log Entry by DF3CB";
const FLEB_ADIF_HEADER = "ADIF Export for Fast Log Entry in-Browser by OH2CME";
const FLE_ID = "<PROGRAMID:3>FLE";
const FLEB_ID = "<PROGRAMID:4>FLEB";
const fs = require("fs");
test('Parse call', () => {
expect(parseCall("on1on")).toBe("ON1ON");
// Myself in Åland islands
expect(parseCall("OH0/OH2CME/P")).toBe("OH0/OH2CME/P");
// https://wiki.sral.fi/wiki/Asematunnus
expect(parseCall("DR06SOCCER")).toBe("DR06SOCCER")
// Random LotW users from http://www.hb9bza.net/lotw/lotw.txt
expect(parseCall("SM/DL1FWN/P")).toBe("SM/DL1FWN/P");
expect(parseCall("SM5CBM")).toBe("SM5CBM");
expect(parseCall("WA2FON/VE9")).toBe("WA2FON/VE9");
expect(parseCall("ZS1/GJ7LJJ/P")).toBe("ZS1/GJ7LJJ/P");
expect(parseCall("ZV9ARSATC")).toBe("ZV9ARSATC");
expect(parseCall("2E0AAO")).toBe("2E0AAO");
// These are not call signs
expect(parseCall(" 80m ")).toBe(null);
expect(parseCall("1001 ft8")).toBe(null);
expect(parseCall("1237 @Bridgette ft8 <foo>")).toBe(null);
// Test context
expect(parseCall("1201 on2on")).toBe("ON2ON");
expect(parseCall(" on3on ")).toBe("ON3ON");
expect(parseCall("23 sm/oh2cme/p #KP20 [asdf] @Mike <foo>")).toBe("SM/OH2CME/P");
// 9X5RU Rwanda
expect(parseCall("9X5RU")).toBe("9X5RU");
// Bouvet island dxpedition 2023
expect(parseCall("3y0j")).toBe("3Y0J")
// King Hussein of Jordan
expect(parseCall("jy1")).toBe("JY1")
// Aalto University satellite Foresail-1
expect(parseCall("OH2F1S")).toBe("OH2F1S")
})
test('Parse time', () => {
// Line beginning with valid hhmm
expect(parseTime("1233 sm1abc")).toStrictEqual(["12", "33"]);
// No time specified
expect(parseTime("la2abc ,3 .22")).toStrictEqual(null);
// Line beginning with valid mm or m
expect(parseTime("42 sm3abc")).toStrictEqual(["12", "42"]);
// Invalid hhmm data
expect(parseTime("9931 sm5abc")).toStrictEqual(null);
expect(parseTime("331 sm5abc")).toStrictEqual(null);
// Do not parse rst as minutes
expect(parseTime("pa0nbb 44")).toStrictEqual(null);
// Time after band/mode
expect(parseTime("80m cw 2335 ra3ax 55")).toStrictEqual(["23", "35"]);
});
test('Parse name', () => {
expect(parseName("33 oh2cme @Matti #KP20")).toBe("Matti");
expect(parseName("33 oh2cme #KP20")).toBe(null);
});
test('Parse grid', () => {
expect(parseGrid("33 oh2cme @Matti #KP20")).toBe("KP20");
expect(parseGrid("33 oh2cme @Matti #KP20lf")).toBe("KP20lf");
expect(parseGrid("33 oh2cme @Matti")).toBe(null);
expect(parseGrid("mygrid #KP20")).toBe("KP20");
expect(parseGrid("mygrid KP20lf")).toBe("KP20lf");
});
test('Parse comment', () => {
expect(parseQsoQslMsg("33 oh2cme @Matti {comment} #KP20")).toBe("comment");
expect(parseQsoQslMsg("33 oh2cme @Matti < comment > #KP20")).toBe(null);
expect(parseQsoQslMsg("33 oh2cme @Matti #KP20")).toBe(null);
});
test('Parse mode', () => {
expect(parseMode("80m cw 2335 ra3ax")).toBe("CW");
expect(parseMode("3.525 cw 2335 ra3ax")).toBe("CW");
expect(parseMode("20m cw")).toBe("CW");
expect(parseMode(" ft8 ")).toBe("FT8");
expect(parseMode("10m ssb asdf")).toBe("SSB");
expect(parseMode("bft8aaaassbbbssbsbcwcwcwcwcw")).toBe(null);
});
test('Parse QSL message', () => {
expect(parseQsoComment("33 oh2cme @Matti <jotain> #KP20")).toBe("jotain");
expect(parseQsoComment("33 oh2cme @Matti #KP20")).toBe(null);
});
test('Parse SOTA reference', () => {
expect(parseSotaref("2203 sm2bb SM/NB-011")).toBe("SM/NB-011")
})
test('Parse POTA reference', () => {
expect(parsePotaref("1345 n0aw pota k-0003")).toBe("K-0003");
expect(parsePotaref("sm1abc @Mats pota k-0003 ")).toBe("K-0003");
expect(parsePotaref("la3bcd pota DA-0147 <foo> {bar}")).toBe("DA-0147");
expect(parsePotaref("1345 n0aw pota k-003")).toBe(null);
})
// https://df3cb.com/fle/documentation/#band
// One decimal point (dot) is required in FLE to be identified as frequency. Frequencies are exported with three places after the decimal point.
test('Detect band for frequency', () => {
expect(detectband("14.044")).toBe("20m");
expect(detectband("3.699")).toBe("80m");
expect(detectband("145.500")).toBe("2m");
expect(detectband(".781")).toBe(null);
});
test('Parse contest serial numbers', () => {
expect(parseSTX("1856 ku1t ,337 .781")).toBe("337")
expect(parseSRX("1856 ku1t ,337 .781")).toBe("781")
})
test('Parse nickname', () => {
expect(parseNick("nickname foo")).toBe("foo")
})
test('ADIF export: basic.txt', () => {
let txt = fs.readFileSync("./src/test/basic.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/basic.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true), true)).toBe(adi);
})
test('ADIF export: sample_wwff_sota.txt', () => {
let txt = fs.readFileSync("./src/test/sample_wwff_sota.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/sample_wwff_sota.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true), true)).toBe(adi);
})
test('ADIF export: pota.txt', () => {
let txt = fs.readFileSync("./src/test/pota.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/pota.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true), true)).toBe(adi);
})
test('ADIF export: sample_dxpedition.txt', () => {
let txt = fs.readFileSync("./src/test/sample_dxpedition.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/sample_dxpedition.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true, false), true)).toBe(adi);
})
test('Test contest serial numbering: contest.txt', () => {
let txt = fs.readFileSync("./src/test/contest.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/contest.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true, true), true)).toBe(adi);
})
test('Test consecutive serial numbering: consecutive.txt', () => {
let txt = fs.readFileSync("./src/test/consecutive.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/consecutive.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true, true), true)).toBe(adi);
})
test('Test fle cli\'s grid example file', () => {
let txt = fs.readFileSync("./src/test/flecligrid.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/flecligrid.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, false, true), true)).toBe(adi);
})
test('FLEB\'s own demo file flebdemo.txt (incl. ft8 rsts)', () => {
let txt = fs.readFileSync("./src/test/flebdemo.txt").toString('utf-8');
let adi = fs.readFileSync("./src/test/flebdemo.adi").toString('utf-8')
.replace(FLE_ADIF_HEADER, FLEB_ADIF_HEADER)
.replace(FLE_ID, FLEB_ID);
expect(printAdif(makeJsonArray(txt, true, false), true)).toBe(adi);
})