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  }