@@ -19,6 +19,7 @@ package jwch
1919import (
2020 "fmt"
2121 "os"
22+ "reflect"
2223 "testing"
2324
2425 "github.com/west2-online/jwch/constants"
@@ -311,3 +312,156 @@ func TestGetLectures(t *testing.T) {
311312 t .Error (err )
312313 }
313314}
315+
316+ func TestApplyAdjustRules (t * testing.T ) {
317+ cases := []struct {
318+ name string
319+ rules []CourseScheduleRule
320+ adjusts []CourseAdjustRule
321+ expected []CourseScheduleRule
322+ }{
323+ {
324+ name : "NoAdjust" ,
325+ rules : []CourseScheduleRule {
326+ {Location : "旗山西1-206" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
327+ },
328+ adjusts : nil ,
329+ expected : []CourseScheduleRule {
330+ {Location : "旗山西1-206" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
331+ },
332+ },
333+ {
334+ name : "EmptyAdjustRules" ,
335+ rules : []CourseScheduleRule {
336+ {Location : "旗山西1-206" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
337+ },
338+ adjusts : []CourseAdjustRule {},
339+ expected : []CourseScheduleRule {
340+ {Location : "旗山西1-206" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
341+ },
342+ },
343+ {
344+ name : "SingleAdjust" ,
345+ rules : []CourseScheduleRule {
346+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 5 , EndWeek : 18 , Weekday : 3 , Single : true , Double : true },
347+ },
348+ adjusts : []CourseAdjustRule {
349+ {OldWeek : 6 , OldWeekday : 3 , OldStartClass : 5 , OldEndClass : 6 , NewWeek : 9 , NewWeekday : 1 , NewStartClass : 7 , NewEndClass : 8 , NewLocation : "旗山西1-206" },
350+ },
351+ expected : []CourseScheduleRule {
352+ {Location : "旗山西1-206" , StartClass : 7 , EndClass : 8 , StartWeek : 9 , EndWeek : 9 , Weekday : 1 , Single : true , Double : true , Adjust : true },
353+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 5 , EndWeek : 5 , Weekday : 3 , Single : true , Double : true },
354+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 7 , EndWeek : 18 , Weekday : 3 , Single : true , Double : true },
355+ },
356+ },
357+ {
358+ name : "AdjustFirstWeek" ,
359+ rules : []CourseScheduleRule {
360+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 8 , Weekday : 2 , Single : true , Double : true },
361+ },
362+ adjusts : []CourseAdjustRule {
363+ {OldWeek : 1 , OldWeekday : 2 , OldStartClass : 3 , OldEndClass : 4 , NewWeek : 10 , NewWeekday : 5 , NewStartClass : 3 , NewEndClass : 4 , NewLocation : "旗山东3-101" },
364+ },
365+ expected : []CourseScheduleRule {
366+ {Location : "旗山东3-101" , StartClass : 3 , EndClass : 4 , StartWeek : 10 , EndWeek : 10 , Weekday : 5 , Single : true , Double : true , Adjust : true },
367+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 2 , EndWeek : 8 , Weekday : 2 , Single : true , Double : true },
368+ },
369+ },
370+ {
371+ name : "AdjustLastWeek" ,
372+ rules : []CourseScheduleRule {
373+ {Location : "铜盘A110" , StartClass : 1 , EndClass : 2 , StartWeek : 5 , EndWeek : 10 , Weekday : 4 , Single : true , Double : true },
374+ },
375+ adjusts : []CourseAdjustRule {
376+ {OldWeek : 10 , OldWeekday : 4 , OldStartClass : 1 , OldEndClass : 2 , NewWeek : 12 , NewWeekday : 3 , NewStartClass : 1 , NewEndClass : 2 , NewLocation : "旗山西1-206" },
377+ },
378+ expected : []CourseScheduleRule {
379+ {Location : "旗山西1-206" , StartClass : 1 , EndClass : 2 , StartWeek : 12 , EndWeek : 12 , Weekday : 3 , Single : true , Double : true , Adjust : true },
380+ {Location : "铜盘A110" , StartClass : 1 , EndClass : 2 , StartWeek : 5 , EndWeek : 9 , Weekday : 4 , Single : true , Double : true },
381+ },
382+ },
383+ {
384+ name : "MultipleAdjusts" ,
385+ rules : []CourseScheduleRule {
386+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 5 , EndWeek : 18 , Weekday : 3 , Single : true , Double : true },
387+ },
388+ adjusts : []CourseAdjustRule {
389+ {OldWeek : 6 , OldWeekday : 3 , OldStartClass : 5 , OldEndClass : 6 , NewWeek : 9 , NewWeekday : 1 , NewStartClass : 7 , NewEndClass : 8 , NewLocation : "旗山西1-206" },
390+ {OldWeek : 10 , OldWeekday : 3 , OldStartClass : 5 , OldEndClass : 6 , NewWeek : 12 , NewWeekday : 2 , NewStartClass : 5 , NewEndClass : 6 , NewLocation : "旗山东3-101" },
391+ },
392+ expected : []CourseScheduleRule {
393+ {Location : "旗山西1-206" , StartClass : 7 , EndClass : 8 , StartWeek : 9 , EndWeek : 9 , Weekday : 1 , Single : true , Double : true , Adjust : true },
394+ {Location : "旗山东3-101" , StartClass : 5 , EndClass : 6 , StartWeek : 12 , EndWeek : 12 , Weekday : 2 , Single : true , Double : true , Adjust : true },
395+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 5 , EndWeek : 5 , Weekday : 3 , Single : true , Double : true },
396+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 7 , EndWeek : 9 , Weekday : 3 , Single : true , Double : true },
397+ {Location : "铜盘A110" , StartClass : 5 , EndClass : 6 , StartWeek : 11 , EndWeek : 18 , Weekday : 3 , Single : true , Double : true },
398+ },
399+ },
400+ {
401+ name : "NoMatchingAdjust" ,
402+ rules : []CourseScheduleRule {
403+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
404+ },
405+ adjusts : []CourseAdjustRule {
406+ {OldWeek : 6 , OldWeekday : 3 , OldStartClass : 3 , OldEndClass : 4 , NewWeek : 9 , NewWeekday : 1 , NewStartClass : 7 , NewEndClass : 8 , NewLocation : "旗山西1-206" },
407+ },
408+ expected : []CourseScheduleRule {
409+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
410+ },
411+ },
412+ {
413+ name : "MultipleScheduleRules" ,
414+ rules : []CourseScheduleRule {
415+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
416+ {Location : "铜盘A508" , StartClass : 7 , EndClass : 8 , StartWeek : 1 , EndWeek : 16 , Weekday : 5 , Single : true , Double : true },
417+ },
418+ adjusts : []CourseAdjustRule {
419+ {OldWeek : 4 , OldWeekday : 5 , OldStartClass : 7 , OldEndClass : 8 , NewWeek : 5 , NewWeekday : 2 , NewStartClass : 7 , NewEndClass : 8 , NewLocation : "旗山东3-101" },
420+ },
421+ expected : []CourseScheduleRule {
422+ {Location : "铜盘A110" , StartClass : 3 , EndClass : 4 , StartWeek : 1 , EndWeek : 16 , Weekday : 1 , Single : true , Double : true },
423+ {Location : "旗山东3-101" , StartClass : 7 , EndClass : 8 , StartWeek : 5 , EndWeek : 5 , Weekday : 2 , Single : true , Double : true , Adjust : true },
424+ {Location : "铜盘A508" , StartClass : 7 , EndClass : 8 , StartWeek : 1 , EndWeek : 3 , Weekday : 5 , Single : true , Double : true },
425+ {Location : "铜盘A508" , StartClass : 7 , EndClass : 8 , StartWeek : 5 , EndWeek : 16 , Weekday : 5 , Single : true , Double : true },
426+ },
427+ },
428+ {
429+ name : "ConsecutiveWeeksRemoved" ,
430+ rules : []CourseScheduleRule {
431+ {Location : "铜盘A110" , StartClass : 1 , EndClass : 2 , StartWeek : 1 , EndWeek : 10 , Weekday : 3 , Single : true , Double : true },
432+ },
433+ adjusts : []CourseAdjustRule {
434+ {OldWeek : 5 , OldWeekday : 3 , OldStartClass : 1 , OldEndClass : 2 , NewWeek : 11 , NewWeekday : 4 , NewStartClass : 1 , NewEndClass : 2 , NewLocation : "旗山西1-206" },
435+ {OldWeek : 6 , OldWeekday : 3 , OldStartClass : 1 , OldEndClass : 2 , NewWeek : 12 , NewWeekday : 4 , NewStartClass : 1 , NewEndClass : 2 , NewLocation : "旗山西1-206" },
436+ },
437+ expected : []CourseScheduleRule {
438+ {Location : "旗山西1-206" , StartClass : 1 , EndClass : 2 , StartWeek : 11 , EndWeek : 11 , Weekday : 4 , Single : true , Double : true , Adjust : true },
439+ {Location : "旗山西1-206" , StartClass : 1 , EndClass : 2 , StartWeek : 12 , EndWeek : 12 , Weekday : 4 , Single : true , Double : true , Adjust : true },
440+ {Location : "铜盘A110" , StartClass : 1 , EndClass : 2 , StartWeek : 1 , EndWeek : 4 , Weekday : 3 , Single : true , Double : true },
441+ {Location : "铜盘A110" , StartClass : 1 , EndClass : 2 , StartWeek : 7 , EndWeek : 10 , Weekday : 3 , Single : true , Double : true },
442+ },
443+ },
444+ {
445+ name : "PreservesFromFullWeek" ,
446+ rules : []CourseScheduleRule {
447+ {Location : "" , StartClass : 1 , EndClass : 8 , StartWeek : 3 , EndWeek : 4 , Weekday : 1 , Single : true , Double : true , FromFullWeek : true },
448+ },
449+ adjusts : []CourseAdjustRule {
450+ {OldWeek : 3 , OldWeekday : 1 , OldStartClass : 1 , OldEndClass : 8 , NewWeek : 5 , NewWeekday : 1 , NewStartClass : 1 , NewEndClass : 8 , NewLocation : "" },
451+ },
452+ expected : []CourseScheduleRule {
453+ {Location : "" , StartClass : 1 , EndClass : 8 , StartWeek : 5 , EndWeek : 5 , Weekday : 1 , Single : true , Double : true , Adjust : true },
454+ {Location : "" , StartClass : 1 , EndClass : 8 , StartWeek : 4 , EndWeek : 4 , Weekday : 1 , Single : true , Double : true , FromFullWeek : true },
455+ },
456+ },
457+ }
458+
459+ for _ , tc := range cases {
460+ t .Run (tc .name , func (t * testing.T ) {
461+ result := ApplyAdjustRules (tc .rules , tc .adjusts )
462+ if ! reflect .DeepEqual (result , tc .expected ) {
463+ t .Errorf ("result mismatch\n got: %+v\n expected: %+v" , result , tc .expected )
464+ }
465+ })
466+ }
467+ }
0 commit comments