@@ -10,6 +10,9 @@ import { State } from 'types/state';
10
10
const CS1010X = clone ( CS1010S ) ;
11
11
CS1010X . moduleCode = 'CS1010X' ;
12
12
13
+ const CS3216_DUPLICATE = clone ( CS3216 ) ;
14
+ const CS1010S_DUPLICATE = clone ( CS1010S ) ;
15
+
13
16
/* eslint-disable no-useless-computed-key */
14
17
15
18
const defaultState : PlannerState = {
@@ -225,6 +228,98 @@ describe(getAcadYearModules, () => {
225
228
] ) ;
226
229
} ) ;
227
230
231
+ test ( 'should return duplicate conflicts' , ( ) => {
232
+ const planner : PlannerState = {
233
+ ...defaultState ,
234
+ modules : {
235
+ 0 : { id : '0' , moduleCode : 'CS3216' , year : '2018/2019' , semester : 1 , index : 0 } ,
236
+ 1 : { id : '1' , moduleCode : 'CS3216' , year : '2018/2019' , semester : 1 , index : 1 } ,
237
+ 2 : { id : '2' , moduleCode : 'CS1010S' , year : '2018/2019' , semester : 2 , index : 0 } ,
238
+ 3 : { id : '3' , moduleCode : 'CS1010S' , year : '2018/2019' , semester : 2 , index : 1 } ,
239
+ } ,
240
+ } ;
241
+
242
+ const moduleBank = {
243
+ modules : { CS3216 , CS3216_DUPLICATE , CS1010S , CS1010S_DUPLICATE } ,
244
+ moduleCodes : {
245
+ CS3216 : { semesters : [ 1 ] } ,
246
+ CS3216_clone : { semesters : [ 1 ] } ,
247
+ CS1010S : { semesters : [ 2 ] } ,
248
+ CS1010S_clone : { semesters : [ 2 ] } ,
249
+ } ,
250
+ } ;
251
+
252
+ const state : any = { planner, moduleBank } ;
253
+
254
+ expect ( getAcadYearModules ( state ) ) . toHaveProperty ( '2018/2019.1' , [
255
+ {
256
+ id : '0' ,
257
+ moduleCode : 'CS3216' ,
258
+ moduleInfo : CS3216 ,
259
+ conflict : { type : 'duplicate' } ,
260
+ } ,
261
+ {
262
+ id : '1' ,
263
+ moduleCode : 'CS3216' ,
264
+ moduleInfo : CS3216_DUPLICATE ,
265
+ conflict : { type : 'duplicate' } ,
266
+ } ,
267
+ ] ) ;
268
+
269
+ expect ( getAcadYearModules ( state ) ) . toHaveProperty ( '2018/2019.2' , [
270
+ {
271
+ id : '2' ,
272
+ moduleCode : 'CS1010S' ,
273
+ moduleInfo : CS1010S ,
274
+ conflict : { type : 'duplicate' } ,
275
+ } ,
276
+ {
277
+ id : '3' ,
278
+ moduleCode : 'CS1010S' ,
279
+ moduleInfo : CS1010S_DUPLICATE ,
280
+ conflict : { type : 'duplicate' } ,
281
+ } ,
282
+ ] ) ;
283
+ } ) ;
284
+
285
+ test ( 'should not have duplicate conflicts for same modules in different semesters' , ( ) => {
286
+ const planner : PlannerState = {
287
+ ...defaultState ,
288
+ modules : {
289
+ 0 : { id : '0' , moduleCode : 'CS1010S' , year : '2018/2019' , semester : 1 , index : 0 } ,
290
+ 1 : { id : '1' , moduleCode : 'CS1010S' , year : '2018/2019' , semester : 2 , index : 0 } ,
291
+ } ,
292
+ } ;
293
+
294
+ const moduleBank = {
295
+ modules : { CS1010S , CS1010S_DUPLICATE } ,
296
+ moduleCodes : {
297
+ CS1010S : { semesters : [ 1 , 2 ] } ,
298
+ CS1010S_clone : { semesters : [ 1 , 2 ] } ,
299
+ } ,
300
+ } ;
301
+
302
+ const state : any = { planner, moduleBank } ;
303
+
304
+ expect ( getAcadYearModules ( state ) ) . toHaveProperty ( '2018/2019.1' , [
305
+ {
306
+ id : '0' ,
307
+ moduleCode : 'CS1010S' ,
308
+ moduleInfo : CS1010S ,
309
+ conflict : null ,
310
+ } ,
311
+ ] ) ;
312
+
313
+ expect ( getAcadYearModules ( state ) ) . toHaveProperty ( '2018/2019.2' , [
314
+ {
315
+ id : '1' ,
316
+ moduleCode : 'CS1010S' ,
317
+ moduleInfo : CS1010S_DUPLICATE ,
318
+ conflict : null ,
319
+ } ,
320
+ ] ) ;
321
+ } ) ;
322
+
228
323
test ( 'should not show exam conflicts for modules not taken this year' , ( ) => {
229
324
const planner : PlannerState = {
230
325
...defaultState ,
0 commit comments