github.com/vlifesystems/rulehunter@v0.0.0-20180501090014-673078aa4a83/internal/progresstest/progress.go (about) 1 // Copyright (C) 2016-2018 vLife Systems Ltd <http://vlifesystems.com> 2 // Licensed under an MIT licence. Please see LICENSE.md for details. 3 4 package progresstest 5 6 import ( 7 "errors" 8 "fmt" 9 "github.com/vlifesystems/rulehunter/progress" 10 "math" 11 "time" 12 ) 13 14 func CheckExperimentsMatch( 15 experiments1 []*progress.Experiment, 16 experiments2 []*progress.Experiment, 17 ignorePercent bool, 18 ) error { 19 if len(experiments1) != len(experiments2) { 20 return fmt.Errorf("Lengths of experiments don't match: %d != %d", 21 len(experiments1), len(experiments2)) 22 } 23 for _, e1 := range experiments1 { 24 filenameFound := false 25 for _, e2 := range experiments2 { 26 if e1.Filename == e2.Filename { 27 filenameFound = true 28 if err := checkExperimentMatch(e1, e2, ignorePercent); err != nil { 29 return err 30 } 31 } 32 } 33 if !filenameFound { 34 return fmt.Errorf("experiment filename: %s, not found", e1.Filename) 35 } 36 } 37 return nil 38 } 39 40 func checkExperimentMatch( 41 e1, e2 *progress.Experiment, 42 ignorePercent bool, 43 ) error { 44 if e1.Title != e2.Title { 45 return fmt.Errorf("Title doesn't match: %s != %s", e1.Title, e2.Title) 46 } 47 if e1.Filename != e2.Filename { 48 return fmt.Errorf("Filename doesn't match: %s != %s", 49 e1.Filename, e2.Filename) 50 } 51 if e1.Status.Msg != e2.Status.Msg { 52 return fmt.Errorf("Status.Msg doesn't match: %s != %s", 53 e1.Status.Msg, e2.Status.Msg) 54 } 55 if !ignorePercent && e1.Status.Percent != e2.Status.Percent { 56 return fmt.Errorf("Status.Percent doesn't match: %f != %f", 57 e1.Status.Percent, e2.Status.Percent) 58 } 59 if e1.Status.State != e2.Status.State { 60 return errors.New("Status.State doesn't match") 61 } 62 if !timesClose(e1.Status.Stamp, e2.Status.Stamp, 10) { 63 return errors.New("Status.Stamp not close in time") 64 } 65 if len(e1.Tags) != len(e2.Tags) { 66 return errors.New("Tags doesn't match") 67 } 68 for i, t := range e1.Tags { 69 if t != e2.Tags[i] { 70 return errors.New("Tags doesn't match") 71 } 72 } 73 if e1.Category != e2.Category { 74 return errors.New("Categories don't match") 75 } 76 return nil 77 } 78 79 func timesClose(t1, t2 time.Time, maxSecondsDiff int) bool { 80 diff := t1.Sub(t2) 81 secondsDiff := math.Abs(diff.Seconds()) 82 return secondsDiff <= float64(maxSecondsDiff) 83 }