diff --git a/director-resume_test.go b/director-resume_test.go index 5cf1d20..f34278b 100644 --- a/director-resume_test.go +++ b/director-resume_test.go @@ -197,7 +197,7 @@ var _ = Describe("Director(Resume)", Ordered, func() { Files: files, Folders: folders, }, - SampleType: enums.SampleTypeSlice, + Type: enums.SampleTypeSlice, Iteration: pref.SamplingIterationOptions{ Each: func(_ *core.Node) bool { return false }, While: func(_ *pref.FilteredInfo) bool { return false }, diff --git a/internal/feat/sampling/controller.go b/internal/feat/sampling/controller.go index 13e8988..71efffb 100644 --- a/internal/feat/sampling/controller.go +++ b/internal/feat/sampling/controller.go @@ -52,14 +52,14 @@ func union(r *readResult) []fs.DirEntry { ) both := lo.Ternary( - r.o.SampleInReverse, last, first, + r.o.InReverse, last, first, )(noOfFiles, r.files) noOfFolders := lo.Ternary(r.o.NoOf.Folders == 0, uint(len(r.folders)), r.o.NoOf.Folders, ) both = append(both, lo.Ternary( - r.o.SampleInReverse, last, first, + r.o.InReverse, last, first, )(noOfFolders, r.folders)...) return both diff --git a/internal/feat/sampling/navigator-sample_test.go b/internal/feat/sampling/navigator-sample_test.go index ca8ae38..9e7b906 100644 --- a/internal/feat/sampling/navigator-sample_test.go +++ b/internal/feat/sampling/navigator-sample_test.go @@ -61,7 +61,7 @@ var _ = Describe("feature", Ordered, func() { }, }, tv.WithSamplingOptions(&pref.SamplingOptions{ - SampleType: enums.SampleTypeSlice, + Type: enums.SampleTypeSlice, NoOf: pref.EntryQuantities{ Files: 2, Folders: 2, @@ -129,8 +129,8 @@ var _ = Describe("feature", Ordered, func() { }, }, tv.WithSamplingOptions(&pref.SamplingOptions{ - SampleType: entry.SampleType, - SampleInReverse: entry.Reverse, + Type: entry.SampleType, + InReverse: entry.Reverse, NoOf: pref.EntryQuantities{ Files: entry.NoOf.Files, Folders: entry.NoOf.Folders, diff --git a/internal/opts/json/sampling-options.go b/internal/opts/json/sampling-options.go index 396669b..ce82a8f 100644 --- a/internal/opts/json/sampling-options.go +++ b/internal/opts/json/sampling-options.go @@ -14,12 +14,12 @@ type ( // SamplingOptions SamplingOptions struct { - // SampleType the type of sampling to use - SampleType enums.SampleType `json:"sample-type"` + // Type the type of sampling to use + Type enums.SampleType `json:"sample-type"` - // SampleInReverse determines the direction of iteration for the sampling + // InReverse determines the direction of iteration for the sampling // operation - SampleInReverse bool `json:"sample-in-reverse"` + InReverse bool `json:"sample-in-reverse"` // NoOf specifies number of items required in each sample (only applies // when not using Custom iterator options) diff --git a/internal/persist/equals.go b/internal/persist/equals.go index 8e56629..a628cf4 100644 --- a/internal/persist/equals.go +++ b/internal/persist/equals.go @@ -153,19 +153,19 @@ func equalBehaviours(o *pref.NavigationBehaviours, jo *json.NavigationBehaviours } func equalSampling(o *pref.SamplingOptions, jo *json.SamplingOptions) (bool, error) { - if o.SampleType != jo.SampleType { + if o.Type != jo.Type { return false, fmt.Errorf("sampling %w", UnequalValueError[enums.SampleType]{ Field: "SampleType", - Value: o.SampleType, - Other: jo.SampleType, + Value: o.Type, + Other: jo.Type, }) } - if o.SampleInReverse != jo.SampleInReverse { + if o.InReverse != jo.InReverse { return false, fmt.Errorf("sampling %w", UnequalValueError[bool]{ Field: "SampleInReverse", - Value: o.SampleInReverse, - Other: jo.SampleInReverse, + Value: o.InReverse, + Other: jo.InReverse, }) } diff --git a/internal/persist/json-options.go b/internal/persist/json-options.go index 11411eb..0e5fa03 100644 --- a/internal/persist/json-options.go +++ b/internal/persist/json-options.go @@ -32,8 +32,8 @@ func ToJSON(o *pref.Options) *json.Options { }, }, Sampling: json.SamplingOptions{ - SampleType: o.Sampling.SampleType, - SampleInReverse: o.Sampling.SampleInReverse, + Type: o.Sampling.Type, + InReverse: o.Sampling.InReverse, NoOf: json.EntryQuantities{ Files: o.Sampling.NoOf.Files, Folders: o.Sampling.NoOf.Folders, @@ -115,8 +115,8 @@ func FromJSON(o *json.Options) *pref.Options { }, }, Sampling: pref.SamplingOptions{ - SampleType: o.Sampling.SampleType, - SampleInReverse: o.Sampling.SampleInReverse, + Type: o.Sampling.Type, + InReverse: o.Sampling.InReverse, NoOf: pref.EntryQuantities{ Files: o.Sampling.NoOf.Files, Folders: o.Sampling.NoOf.Folders, diff --git a/internal/persist/marshaler_test.go b/internal/persist/marshaler_test.go index 6667499..b5c3c9a 100644 --- a/internal/persist/marshaler_test.go +++ b/internal/persist/marshaler_test.go @@ -23,10 +23,16 @@ import ( ) var _ = Describe("Marshaler", Ordered, func() { + const ( + foo = "foo" + ) + var ( - FS lfs.TraverseFS - nodeFilterDef *core.FilterDef - childFilterDef *core.ChildFilterDef + FS lfs.TraverseFS + nodeFilterDef *core.FilterDef + childFilterDef *core.ChildFilterDef + samplingOptions *pref.SamplingOptions + sampleFilterDef *core.SampleFilterDef ) BeforeAll(func() { @@ -46,6 +52,27 @@ var _ = Describe("Marshaler", Ordered, func() { Pattern: "*.flac", Negate: true, } + + samplingOptions = &pref.SamplingOptions{ + Type: enums.SampleTypeFilter, + InReverse: true, + NoOf: pref.EntryQuantities{ + Files: 2, + Folders: 3, + }, + } + + sampleFilterDef = &core.SampleFilterDef{ + Type: enums.FilterTypeGlob, + Description: "items without .flac suffix", + Pattern: "*.flac", + Scope: enums.ScopeAll, + Negate: true, + Poly: &core.PolyFilterDef{ + File: *nodeFilterDef, + Folder: *nodeFilterDef, + }, + } }) BeforeEach(func() { @@ -85,7 +112,10 @@ var _ = Describe("Marshaler", Ordered, func() { Expect(err).To(Succeed()) Expect(jo).NotTo(BeNil()) - equals, err := persist.Equals(o, &json.Options{}) + if entry.marshalTE.tweak != nil { + entry.marshalTE.tweak(jo) + } + equals, err := persist.Equals(o, jo) Expect(equals).To(BeFalse(), "should not compare equal") Expect(err).NotTo(Succeed()) }, @@ -102,6 +132,9 @@ var _ = Describe("Marshaler", Ordered, func() { KeepTrailingSep: false, }) }, + tweak: func(jo *json.Options) { + jo.Behaviours.SubPath.KeepTrailingSep = true + }, }, }), @@ -114,6 +147,9 @@ var _ = Describe("Marshaler", Ordered, func() { SortFilesFirst: true, }) }, + tweak: func(jo *json.Options) { + jo.Behaviours.Sort.IsCaseSensitive = false + }, }, }), @@ -123,6 +159,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithDepth(4) }, + tweak: func(jo *json.Options) { + jo.Behaviours.Cascade.Depth = 99 + }, }, }), @@ -130,67 +169,345 @@ var _ = Describe("Marshaler", Ordered, func() { marshalTE: marshalTE{ given: "NavigationBehaviours.CascadeBehaviour.NoRecurse", option: pref.WithNoRecurse, + tweak: func(jo *json.Options) { + jo.Behaviours.Cascade.NoRecurse = false + }, }, }), // SamplingOptions: Entry(nil, &errorTE{ marshalTE: marshalTE{ - given: "NavigationBehaviours.SamplingOptions", + given: "NavigationBehaviours.SamplingOptions.SampleInReverse", + option: func() pref.Option { + return pref.WithSamplingOptions(&pref.SamplingOptions{ + Type: enums.SampleTypeFilter, + InReverse: true, + NoOf: pref.EntryQuantities{ + Files: 3, + Folders: 4, + }, + }) + }, + tweak: func(jo *json.Options) { + jo.Sampling.InReverse = false + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "NavigationBehaviours.SamplingOptions.SampleType", + option: func() pref.Option { + return pref.WithSamplingOptions(&pref.SamplingOptions{ + Type: enums.SampleTypeFilter, + InReverse: true, + NoOf: pref.EntryQuantities{ + Files: 3, + Folders: 4, + }, + }) + }, + tweak: func(jo *json.Options) { + jo.Sampling.Type = enums.SampleTypeSlice + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "NavigationBehaviours.SamplingOptions.NoOf.Files", + option: func() pref.Option { + return pref.WithSamplingOptions(&pref.SamplingOptions{ + Type: enums.SampleTypeFilter, + InReverse: true, + NoOf: pref.EntryQuantities{ + Files: 3, + Folders: 4, + }, + }) + }, + tweak: func(jo *json.Options) { + jo.Sampling.NoOf.Files = 99 + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "NavigationBehaviours.SamplingOptions.NoOf.Folders", option: func() pref.Option { return pref.WithSamplingOptions(&pref.SamplingOptions{ - SampleType: enums.SampleTypeFilter, - SampleInReverse: true, + Type: enums.SampleTypeFilter, + InReverse: true, NoOf: pref.EntryQuantities{ Files: 3, Folders: 4, }, }) }, + tweak: func(jo *json.Options) { + jo.Sampling.NoOf.Folders = 99 + }, }, }), // FilterOptions: Entry(nil, &errorTE{ marshalTE: marshalTE{ - given: "FilterOptions - Node", + given: "FilterOptions - Node.Type", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Node: nodeFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Node.Type = enums.FilterTypeExtendedGlob + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Node.Description", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Node: nodeFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Node.Description = foo + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Node.Pattern", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Node: nodeFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Node.Pattern = "*.foo" + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Node.Scope", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Node: nodeFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Node.Scope = enums.ScopeFile + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Node.Negate", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Node: nodeFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Node.Negate = false + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Node.IfNotApplicable", option: func() pref.Option { return pref.WithFilter(&pref.FilterOptions{ Node: nodeFilterDef, }) }, + tweak: func(jo *json.Options) { + jo.Filter.Node.IfNotApplicable = enums.TriStateBoolFalse + }, }, }), Entry(nil, &errorTE{ marshalTE: marshalTE{ - given: "FilterOptions - Child", + given: "FilterOptions - Child.Type", option: func() pref.Option { return pref.WithFilter(&pref.FilterOptions{ Child: childFilterDef, }) }, + tweak: func(jo *json.Options) { + jo.Filter.Child.Type = enums.FilterTypeExtendedGlob + }, }, }), Entry(nil, &errorTE{ marshalTE: marshalTE{ - given: "FilterOptions - Sample", + given: "FilterOptions - Child.Description", option: func() pref.Option { return pref.WithFilter(&pref.FilterOptions{ - Sample: &core.SampleFilterDef{ - Type: enums.FilterTypeGlob, - Description: "items without .flac suffix", - Pattern: "*.flac", - Scope: enums.ScopeAll, - Negate: true, - Poly: &core.PolyFilterDef{ - File: *nodeFilterDef, - Folder: *nodeFilterDef, - }, - }, + Child: childFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Child.Description = foo + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Child.Pattern", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Child: childFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Child.Pattern = foo + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Child.Negate", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Child: childFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Child.Negate = false + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Sample.Type", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Sample: sampleFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Sample.Type = enums.FilterTypeExtendedGlob + }, + }, + }), + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Sample.Description", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Sample: sampleFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Sample.Description = foo + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Sample.Pattern", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Sample: sampleFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Sample.Pattern = "*.foo" + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Sample.Scope", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Sample: sampleFilterDef, }) }, + tweak: func(jo *json.Options) { + jo.Filter.Sample.Scope = enums.ScopeFile + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "FilterOptions - Sample.Negate", + option: func() pref.Option { + return pref.WithFilter(&pref.FilterOptions{ + Sample: sampleFilterDef, + }) + }, + tweak: func(jo *json.Options) { + jo.Filter.Sample.Negate = false + }, + }, + }), + + // SamplingOptions: + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "Sampling - SampleOptions.Type", + option: func() pref.Option { + return pref.WithSamplingOptions(samplingOptions) + }, + tweak: func(jo *json.Options) { + jo.Sampling.Type = enums.SampleTypeSlice + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "Sampling - SampleOptions.InReverse", + option: func() pref.Option { + return pref.WithSamplingOptions(samplingOptions) + }, + tweak: func(jo *json.Options) { + jo.Sampling.InReverse = false + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "Sampling - SampleOptions.NoOf.Files", + option: func() pref.Option { + return pref.WithSamplingOptions(samplingOptions) + }, + tweak: func(jo *json.Options) { + jo.Sampling.NoOf.Files = 99 + }, + }, + }), + + Entry(nil, &errorTE{ + marshalTE: marshalTE{ + given: "Sampling - SampleOptions.NoOf.Folders", + option: func() pref.Option { + return pref.WithSamplingOptions(samplingOptions) + }, + tweak: func(jo *json.Options) { + jo.Sampling.NoOf.Folders = 99 + }, }, }), @@ -201,6 +518,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithHibernationFilterWake(nodeFilterDef) }, + tweak: func(jo *json.Options) { + jo.Hibernate.WakeAt.Description = foo + }, }, }), @@ -210,6 +530,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithHibernationFilterSleep(nodeFilterDef) }, + tweak: func(jo *json.Options) { + jo.Hibernate.SleepAt.Description = foo + }, }, }), @@ -217,6 +540,9 @@ var _ = Describe("Marshaler", Ordered, func() { marshalTE: marshalTE{ given: "HibernateOptions.Behaviour.InclusiveWake", option: pref.WithHibernationBehaviourExclusiveWake, + tweak: func(jo *json.Options) { + jo.Hibernate.Behaviour.InclusiveWake = true + }, }, }), @@ -224,6 +550,9 @@ var _ = Describe("Marshaler", Ordered, func() { marshalTE: marshalTE{ given: "HibernateOptions.Behaviour.InclusiveSleep", option: pref.WithHibernationBehaviourInclusiveSleep, + tweak: func(jo *json.Options) { + jo.Hibernate.Behaviour.InclusiveSleep = false + }, }, }), @@ -234,6 +563,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithNoW(5) }, + tweak: func(jo *json.Options) { + jo.Concurrency.NoW = 99 + }, }, }), ) diff --git a/internal/persist/persist-suite_test.go b/internal/persist/persist-suite_test.go index 5d959e9..67a8a4b 100644 --- a/internal/persist/persist-suite_test.go +++ b/internal/persist/persist-suite_test.go @@ -5,6 +5,7 @@ import ( . "github.com/onsi/ginkgo/v2" //nolint:revive // ok . "github.com/onsi/gomega" //nolint:revive // ok + "github.com/snivilised/traverse/internal/opts/json" "github.com/snivilised/traverse/pref" ) @@ -27,6 +28,7 @@ type ( marshalTE struct { given string option func() pref.Option + tweak func(jo *json.Options) } errorTE struct { diff --git a/pref/options-sampling.go b/pref/options-sampling.go index e5b4044..8675095 100644 --- a/pref/options-sampling.go +++ b/pref/options-sampling.go @@ -8,12 +8,12 @@ import ( type ( // SamplingOptions SamplingOptions struct { - // SampleType the type of sampling to use - SampleType enums.SampleType + // Type the type of sampling to use + Type enums.SampleType - // SampleInReverse determines the direction of iteration for the sampling + // InReverse determines the direction of iteration for the sampling // operation - SampleInReverse bool + InReverse bool // NoOf specifies number of items required in each sample (only applies // when not using Custom iterator options) @@ -77,7 +77,7 @@ type ( ) func (o SamplingOptions) IsSamplingActive() bool { - return o.SampleType != enums.SampleTypeUndefined + return o.Type != enums.SampleTypeUndefined } // WithSamplingOptions specifies the sampling options. diff --git a/pref/with-operators_test.go b/pref/with-operators_test.go index d910324..1711913 100644 --- a/pref/with-operators_test.go +++ b/pref/with-operators_test.go @@ -151,8 +151,8 @@ var _ = Describe("With Operators", Ordered, func() { It("🧪 should: create option", func() { Expect(tv.WithSamplingOptions( &pref.SamplingOptions{ - SampleType: enums.SampleTypeFilter, - SampleInReverse: true, + Type: enums.SampleTypeFilter, + InReverse: true, NoOf: pref.EntryQuantities{ Files: 2, Folders: 3, diff --git a/scripts/coverage-exclusion-list.txt b/scripts/coverage-exclusion-list.txt index ff91fa1..914b755 100644 --- a/scripts/coverage-exclusion-list.txt +++ b/scripts/coverage-exclusion-list.txt @@ -1,4 +1,3 @@ github.com/snivilised/traverse/enums github.com/snivilised/traverse/internal/third github.com/snivilised/traverse/internal/laboratory/ -github.com/snivilised/traverse/internal/persist/equals.go