1package watch
2
3import (
4	"fmt"
5	"math"
6	"time"
7
8	"github.com/onsi/ginkgo/ginkgo/testsuite"
9)
10
11type Suite struct {
12	Suite        testsuite.TestSuite
13	RunTime      time.Time
14	Dependencies Dependencies
15
16	sharedPackageHashes *PackageHashes
17}
18
19func NewSuite(suite testsuite.TestSuite, maxDepth int, sharedPackageHashes *PackageHashes) (*Suite, error) {
20	deps, err := NewDependencies(suite.Path, maxDepth)
21	if err != nil {
22		return nil, err
23	}
24
25	sharedPackageHashes.Add(suite.Path)
26	for dep := range deps.Dependencies() {
27		sharedPackageHashes.Add(dep)
28	}
29
30	return &Suite{
31		Suite:        suite,
32		Dependencies: deps,
33
34		sharedPackageHashes: sharedPackageHashes,
35	}, nil
36}
37
38func (s *Suite) Delta() float64 {
39	delta := s.delta(s.Suite.Path, true, 0) * 1000
40	for dep, depth := range s.Dependencies.Dependencies() {
41		delta += s.delta(dep, false, depth)
42	}
43	return delta
44}
45
46func (s *Suite) MarkAsRunAndRecomputedDependencies(maxDepth int) error {
47	s.RunTime = time.Now()
48
49	deps, err := NewDependencies(s.Suite.Path, maxDepth)
50	if err != nil {
51		return err
52	}
53
54	s.sharedPackageHashes.Add(s.Suite.Path)
55	for dep := range deps.Dependencies() {
56		s.sharedPackageHashes.Add(dep)
57	}
58
59	s.Dependencies = deps
60
61	return nil
62}
63
64func (s *Suite) Description() string {
65	numDeps := len(s.Dependencies.Dependencies())
66	pluralizer := "ies"
67	if numDeps == 1 {
68		pluralizer = "y"
69	}
70	return fmt.Sprintf("%s [%d dependenc%s]", s.Suite.Path, numDeps, pluralizer)
71}
72
73func (s *Suite) delta(packagePath string, includeTests bool, depth int) float64 {
74	return math.Max(float64(s.dt(packagePath, includeTests)), 0) / float64(depth+1)
75}
76
77func (s *Suite) dt(packagePath string, includeTests bool) time.Duration {
78	packageHash := s.sharedPackageHashes.Get(packagePath)
79	var modifiedTime time.Time
80	if includeTests {
81		modifiedTime = packageHash.TestModifiedTime
82	} else {
83		modifiedTime = packageHash.CodeModifiedTime
84	}
85
86	return modifiedTime.Sub(s.RunTime)
87}
88