From 988f1a69ea7b6d5470cabd32b2c648369f1b4d12 Mon Sep 17 00:00:00 2001 From: plastikfan Date: Tue, 8 Oct 2024 14:15:22 +0100 Subject: [PATCH] ref(persist): improve marshal with comparison, request and result (#209) --- internal/persist/equals.go | 18 ++- internal/persist/json-matcher_test.go | 10 +- internal/persist/marshaler-filters_test.go | 155 ++++++++++---------- internal/persist/marshaler-local-fs_test.go | 2 +- internal/persist/marshaler.go | 64 +++++--- internal/persist/marshaler_test.go | 113 ++++++++------ internal/persist/persist-suite_test.go | 5 +- internal/types/definitions.go | 5 + 8 files changed, 217 insertions(+), 155 deletions(-) diff --git a/internal/persist/equals.go b/internal/persist/equals.go index 2da1fb0..bf4f874 100644 --- a/internal/persist/equals.go +++ b/internal/persist/equals.go @@ -10,6 +10,10 @@ import ( "github.com/snivilised/traverse/pref" ) +const ( + Anon = "ANON" +) + type UnequalValueError[T any] struct { Field string Value T @@ -42,13 +46,21 @@ func (UnequalPtrError[T, O]) Unwrap() error { return locale.ErrUnEqualConversion } -// Equals compare the pref.Options instance to the derived json instance json.Options. +func Equals(comparison *Comparison) error { + return equalOptions(comparison.O, comparison.JO) +} + +// equalOptions compare the pref.Options instance to the derived json instance json.Options. // We can't use DeepEquals on the structs, because even though the structs // may have the same members, DeepEqual will still fail because the host struct is // different; eg: pref.NavigationBehaviours and json.NavigationBehaviours contain // the same members, but they are different structs; which means comparison has to be -// done manually. -func Equals(o *pref.Options, jo *json.Options) error { +// done manually. equalOptions is only required because we have a custom mapping between +// pref.Options and json.Options, in the form of ToJSON/FromJSON +// +// We do need to apply the same technique to Active state, because there is no json +// version of ActiveState, so there is no custom functionality we need to check. +func equalOptions(o *pref.Options, jo *json.Options) error { if o == nil { return fmt.Errorf("pref.Options %w", UnequalPtrError[pref.Options, json.Options]{ diff --git a/internal/persist/json-matcher_test.go b/internal/persist/json-matcher_test.go index aa97ddd..ae52211 100644 --- a/internal/persist/json-matcher_test.go +++ b/internal/persist/json-matcher_test.go @@ -28,7 +28,10 @@ func (m *MarshalJSONMatcher) Match(actual interface{}) (bool, error) { return false, fmt.Errorf("❌ matcher expected a *json.Options instance (%T)", jo) } - if err := persist.Equals(m.o, jo); err != nil { + if err := persist.Equals(&persist.Comparison{ + O: m.o, + JO: jo, + }); err != nil { m.err = err return false, err } @@ -62,7 +65,10 @@ func (m *UnMarshalJSONMatcher) Match(actual interface{}) (bool, error) { return false, fmt.Errorf("❌ matcher expected a *pref.Options instance (%T)", o) } - if err := persist.Equals(o, m.jo); err != nil { + if err := persist.Equals(&persist.Comparison{ + O: o, + JO: m.jo, + }); err != nil { m.err = err return false, err } diff --git a/internal/persist/marshaler-filters_test.go b/internal/persist/marshaler-filters_test.go index 0d601d3..7e0d228 100644 --- a/internal/persist/marshaler-filters_test.go +++ b/internal/persist/marshaler-filters_test.go @@ -13,6 +13,7 @@ import ( "github.com/snivilised/traverse/enums" lab "github.com/snivilised/traverse/internal/laboratory" "github.com/snivilised/traverse/internal/opts/json" + "github.com/snivilised/traverse/internal/persist" "github.com/snivilised/traverse/lfs" "github.com/snivilised/traverse/pref" ) @@ -242,8 +243,8 @@ var _ = Describe("Marshaler", Ordered, func() { persistTE: persistTE{ given: "FilterOptions - nil:pref.Options", }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &json.FilterDef{ + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &json.FilterDef{ Type: enums.FilterTypeRegex, Description: foo, Pattern: flac, @@ -261,8 +262,8 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = nil + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = nil }, }), @@ -279,9 +280,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.Type = enums.FilterTypeExtendedGlob + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.Type = enums.FilterTypeExtendedGlob }, }), @@ -298,9 +299,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.Description = foo }, }), @@ -317,9 +318,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.Pattern = bar + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.Pattern = bar }, }), @@ -336,9 +337,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.Scope = enums.ScopeFile + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.Scope = enums.ScopeFile }, }), @@ -355,9 +356,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.Negate = false + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.Negate = false }, }), @@ -374,9 +375,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: sourceNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonNodeFilterDef - jo.Filter.Node.IfNotApplicable = enums.TriStateBoolFalse + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonNodeFilterDef + result.JO.Filter.Node.IfNotApplicable = enums.TriStateBoolFalse }, }), @@ -386,8 +387,8 @@ var _ = Describe("Marshaler", Ordered, func() { persistTE: persistTE{ given: "FilterOptions.Node.Poly - nil:pref.Options", }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonPolyNodeFilterDef + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonPolyNodeFilterDef }, }), @@ -400,8 +401,8 @@ var _ = Describe("Marshaler", Ordered, func() { Node: polyNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = nil + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = nil }, }), @@ -418,9 +419,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: polyNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonPolyNodeFilterDef - jo.Filter.Node.Poly.File.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonPolyNodeFilterDef + result.JO.Filter.Node.Poly.File.Description = foo }, }), @@ -437,9 +438,9 @@ var _ = Describe("Marshaler", Ordered, func() { Node: polyNodeFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Node = &jsonPolyNodeFilterDef - jo.Filter.Node.Poly.Folder.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Node = &jsonPolyNodeFilterDef + result.JO.Filter.Node.Poly.Folder.Description = foo }, }), @@ -449,8 +450,8 @@ var _ = Describe("Marshaler", Ordered, func() { persistTE: persistTE{ given: "FilterOptions - nil:pref.Options", }, - tweak: func(jo *json.Options) { - jo.Filter.Child = &json.ChildFilterDef{ + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = &json.ChildFilterDef{ Type: enums.FilterTypeGlob, Description: "items without .flac suffix", Pattern: flac, @@ -468,8 +469,8 @@ var _ = Describe("Marshaler", Ordered, func() { Child: sourceChildFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Child = nil + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = nil }, }), @@ -486,9 +487,9 @@ var _ = Describe("Marshaler", Ordered, func() { Child: sourceChildFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Child = jsonChildFilterDef - jo.Filter.Child.Type = enums.FilterTypeExtendedGlob + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = jsonChildFilterDef + result.JO.Filter.Child.Type = enums.FilterTypeExtendedGlob }, }), @@ -505,9 +506,9 @@ var _ = Describe("Marshaler", Ordered, func() { Child: sourceChildFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Child = jsonChildFilterDef - jo.Filter.Child.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = jsonChildFilterDef + result.JO.Filter.Child.Description = foo }, }), @@ -524,9 +525,9 @@ var _ = Describe("Marshaler", Ordered, func() { Child: sourceChildFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Child = jsonChildFilterDef - jo.Filter.Child.Pattern = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = jsonChildFilterDef + result.JO.Filter.Child.Pattern = foo }, }), @@ -543,9 +544,9 @@ var _ = Describe("Marshaler", Ordered, func() { Child: sourceChildFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Child = jsonChildFilterDef - jo.Filter.Child.Negate = false + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Child = jsonChildFilterDef + result.JO.Filter.Child.Negate = false }, }), @@ -555,8 +556,8 @@ var _ = Describe("Marshaler", Ordered, func() { persistTE: persistTE{ given: "FilterOptions - nil:pref.Options", }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef }, }), @@ -569,8 +570,8 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = nil + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = nil }, }), @@ -587,9 +588,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef - jo.Filter.Sample.Type = enums.FilterTypeExtendedGlob + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef + result.JO.Filter.Sample.Type = enums.FilterTypeExtendedGlob }, }), @@ -606,9 +607,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef - jo.Filter.Sample.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef + result.JO.Filter.Sample.Description = foo }, }), @@ -625,9 +626,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef - jo.Filter.Sample.Pattern = bar + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef + result.JO.Filter.Sample.Pattern = bar }, }), @@ -644,9 +645,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef - jo.Filter.Sample.Scope = enums.ScopeFile + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef + result.JO.Filter.Sample.Scope = enums.ScopeFile }, }), @@ -663,9 +664,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sourceSampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSampleFilterDef - jo.Filter.Sample.Negate = false + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSampleFilterDef + result.JO.Filter.Sample.Negate = false }, }), @@ -675,8 +676,8 @@ var _ = Describe("Marshaler", Ordered, func() { persistTE: persistTE{ given: "FilterOptions.Sample.Poly - nil:pref.Options", }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSamplePolyFilterDef + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSamplePolyFilterDef }, }), @@ -689,8 +690,8 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = nil + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = nil }, }), @@ -707,9 +708,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSamplePolyFilterDef - jo.Filter.Sample.Poly.File.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSamplePolyFilterDef + result.JO.Filter.Sample.Poly.File.Description = foo }, }), @@ -726,9 +727,9 @@ var _ = Describe("Marshaler", Ordered, func() { Sample: sampleFilterDef, }) }, - tweak: func(jo *json.Options) { - jo.Filter.Sample = jsonSamplePolyFilterDef - jo.Filter.Sample.Poly.Folder.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Filter.Sample = jsonSamplePolyFilterDef + result.JO.Filter.Sample.Poly.Folder.Description = foo }, }), ) diff --git a/internal/persist/marshaler-local-fs_test.go b/internal/persist/marshaler-local-fs_test.go index b5b11ff..55d6de3 100644 --- a/internal/persist/marshaler-local-fs_test.go +++ b/internal/persist/marshaler-local-fs_test.go @@ -51,7 +51,7 @@ var _ = Describe("Marshaler", Ordered, func() { writerFS := lfs.NewWriteFileFS(testPath, NoOverwrite) writePath := destination + "/" + tempFile - jo, err := persist.Marshal(&persist.MarshalState{ + jo, err := persist.Marshal(&persist.MarshalRequest{ O: o, Active: &types.ActiveState{ Root: destination, diff --git a/internal/persist/marshaler.go b/internal/persist/marshaler.go index 6671f64..b8dbb0c 100644 --- a/internal/persist/marshaler.go +++ b/internal/persist/marshaler.go @@ -17,32 +17,46 @@ type ( // default. Typically a single test will focus on a single field, // so that the TamperFunc is expected to only update 1 of the members at a // time. - TamperFunc func(jo *json.Options) + TamperFunc func(result *MarshalResult) - MarshalState struct { + MarshalRequest struct { O *pref.Options Active *types.ActiveState - JO *json.Options Path string Perm fs.FileMode FS lfs.WriteFileFS } - JSONState struct { + MarshalResult struct { JO *json.Options Active *types.ActiveState } + + UnmarshalRequest struct { + Restore *types.RestoreState + } + + UnmarshalResult struct { + O *pref.Options + Active *types.ActiveState + JO *json.Options + } + + Comparison struct { + O *pref.Options + JO *json.Options + } ) -func Marshal(ms *MarshalState) (*json.Options, error) { - jo := ToJSON(ms.O) - state := &JSONState{ +func Marshal(request *MarshalRequest) (*MarshalResult, error) { + jo := ToJSON(request.O) + result := &MarshalResult{ JO: jo, - Active: ms.Active, + Active: request.Active.Clone(), } data, err := ejson.MarshalIndent( - state, + result, JSONMarshalNoPrefix, JSONMarshal2SpacesIndent, ) @@ -50,37 +64,43 @@ func Marshal(ms *MarshalState) (*json.Options, error) { return nil, err } - if err := Equals(ms.O, jo); err != nil { - return jo, err + if err := Equals(&Comparison{ + O: request.O, + JO: jo, + }); err != nil { + return result, err } - return jo, ms.FS.WriteFile(ms.Path, data, ms.Perm) + return result, request.FS.WriteFile(request.Path, data, request.Perm) } -func Unmarshal(rs *types.RestoreState, tampers ...TamperFunc) (*MarshalState, error) { - bytes, err := rs.FS.ReadFile(rs.Path) +func Unmarshal(request *UnmarshalRequest, tampers ...TamperFunc) (*UnmarshalResult, error) { + bytes, err := request.Restore.FS.ReadFile(request.Restore.Path) if err != nil { return nil, err } var ( - js JSONState + mr MarshalResult ) - if err := ejson.Unmarshal(bytes, &js); err != nil { + if err := ejson.Unmarshal(bytes, &mr); err != nil { return nil, err } for _, fn := range tampers { - fn(js.JO) + fn(&mr) } - ms := MarshalState{ - O: FromJSON(js.JO), - Active: js.Active, - JO: js.JO, + result := UnmarshalResult{ + O: FromJSON(mr.JO), + Active: mr.Active, + JO: mr.JO, } - return &ms, Equals(ms.O, js.JO) + return &result, Equals(&Comparison{ + O: result.O, + JO: result.JO, + }) } diff --git a/internal/persist/marshaler_test.go b/internal/persist/marshaler_test.go index 2a2352a..c50d7ba 100644 --- a/internal/persist/marshaler_test.go +++ b/internal/persist/marshaler_test.go @@ -48,7 +48,7 @@ func marshal(entry *marshalTE, tfs lfs.TraverseFS) *tampered { Expect(err).To(Succeed(), "MARSHAL") writePath := destination + "/" + tempFile - jo, err := persist.Marshal(&persist.MarshalState{ + request := &persist.MarshalRequest{ O: o, Active: &types.ActiveState{ Root: destination, @@ -59,39 +59,51 @@ func marshal(entry *marshalTE, tfs lfs.TraverseFS) *tampered { Path: writePath, Perm: perms.File, FS: tfs, - }) + } + result, err := persist.Marshal(request) Expect(err).To(Succeed(), "MARSHAL") - Expect(jo).NotTo(BeNil()) + Expect(result).NotTo(BeNil()) // unequal error: if entry.tweak != nil { - entry.tweak(jo) + entry.tweak(result) } - e := persist.Equals(o, jo) + e := persist.Equals(&persist.Comparison{ + O: o, + JO: result.JO, + }) + Expect(e).NotTo(Succeed(), "MARSHAL") if e != nil && entry.checkerTE != nil && entry.checkerTE.checker != nil { Expect(entry.checker(entry.checkerTE, e)).To(Succeed(), "MARSHAL") } return &tampered{ - o: o, - jo: jo, + o: o, + result: result, } } func unmarshal(entry *marshalTE, tfs lfs.TraverseFS, restorePath string, t *tampered) { // success: - state, err := persist.Unmarshal(&types.RestoreState{ - Path: restorePath, - FS: tfs, - Resume: enums.ResumeStrategySpawn, - }, entry.tweak) + request := &persist.UnmarshalRequest{ + Restore: &types.RestoreState{ + Path: restorePath, + FS: tfs, + Resume: enums.ResumeStrategySpawn, + }, + } + state, err := persist.Unmarshal(request, entry.tweak) Expect(err).To(Succeed(), "UNMARSHAL") // unequal error: - e := persist.Equals(t.o, state.JO) + e := persist.Equals(&persist.Comparison{ + O: t.o, + JO: state.JO, + }) + Expect(e).NotTo(Succeed(), "UNMARSHAL") if e != nil && entry.checkerTE != nil && entry.checkerTE.checker != nil { @@ -196,8 +208,8 @@ var _ = Describe("Marshaler", Ordered, func() { KeepTrailingSep: false, }) }, - tweak: func(jo *json.Options) { - jo.Behaviours.SubPath.KeepTrailingSep = true + tweak: func(result *persist.MarshalResult) { + result.JO.Behaviours.SubPath.KeepTrailingSep = true }, }), @@ -214,8 +226,8 @@ var _ = Describe("Marshaler", Ordered, func() { IsCaseSensitive: true, }) }, - tweak: func(jo *json.Options) { - jo.Behaviours.Sort.IsCaseSensitive = false + tweak: func(result *persist.MarshalResult) { + result.JO.Behaviours.Sort.IsCaseSensitive = false }, }), @@ -232,8 +244,8 @@ var _ = Describe("Marshaler", Ordered, func() { SortFilesFirst: true, }) }, - tweak: func(jo *json.Options) { - jo.Behaviours.Sort.SortFilesFirst = false + tweak: func(result *persist.MarshalResult) { + result.JO.Behaviours.Sort.SortFilesFirst = false }, }), @@ -248,8 +260,8 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithDepth(4) }, - tweak: func(jo *json.Options) { - jo.Behaviours.Cascade.Depth = 99 + tweak: func(result *persist.MarshalResult) { + result.JO.Behaviours.Cascade.Depth = 99 }, }), @@ -262,8 +274,8 @@ var _ = Describe("Marshaler", Ordered, func() { checker: check[bool], }, option: pref.WithNoRecurse, - tweak: func(jo *json.Options) { - jo.Behaviours.Cascade.NoRecurse = false + tweak: func(result *persist.MarshalResult) { + result.JO.Behaviours.Cascade.NoRecurse = false }, }), @@ -280,9 +292,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithSamplingOptions(samplingOptions) }, - tweak: func(jo *json.Options) { - jo.Sampling = *jsonSamplingOptions - jo.Sampling.Type = enums.SampleTypeSlice + tweak: func(result *persist.MarshalResult) { + result.JO.Sampling = *jsonSamplingOptions + result.JO.Sampling.Type = enums.SampleTypeSlice }, }), @@ -299,8 +311,8 @@ var _ = Describe("Marshaler", Ordered, func() { InReverse: true, }) }, - tweak: func(jo *json.Options) { - jo.Sampling.InReverse = false + tweak: func(result *persist.MarshalResult) { + result.JO.Sampling.InReverse = false }, }), @@ -315,9 +327,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithSamplingOptions(samplingOptions) }, - tweak: func(jo *json.Options) { - jo.Sampling = *jsonSamplingOptions - jo.Sampling.NoOf.Files = 99 + tweak: func(result *persist.MarshalResult) { + result.JO.Sampling = *jsonSamplingOptions + result.JO.Sampling.NoOf.Files = 99 }, }), @@ -328,8 +340,8 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithSamplingOptions(samplingOptions) }, - tweak: func(jo *json.Options) { - jo.Sampling.NoOf.Folders = 99 + tweak: func(result *persist.MarshalResult) { + result.JO.Sampling.NoOf.Folders = 99 }, }), @@ -346,9 +358,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithHibernationFilterWake(sourceNodeFilterDef) }, - tweak: func(jo *json.Options) { - jo.Hibernate.WakeAt = &jsonNodeFilterDef - jo.Hibernate.WakeAt.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Hibernate.WakeAt = &jsonNodeFilterDef + result.JO.Hibernate.WakeAt.Description = foo }, }), @@ -363,9 +375,9 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithHibernationFilterSleep(sourceNodeFilterDef) }, - tweak: func(jo *json.Options) { - jo.Hibernate.SleepAt = &jsonNodeFilterDef - jo.Hibernate.SleepAt.Description = foo + tweak: func(result *persist.MarshalResult) { + result.JO.Hibernate.SleepAt = &jsonNodeFilterDef + result.JO.Hibernate.SleepAt.Description = foo }, }), @@ -378,8 +390,8 @@ var _ = Describe("Marshaler", Ordered, func() { checker: check[bool], }, option: pref.WithHibernationBehaviourExclusiveWake, - tweak: func(jo *json.Options) { - jo.Hibernate.Behaviour.InclusiveWake = true + tweak: func(result *persist.MarshalResult) { + result.JO.Hibernate.Behaviour.InclusiveWake = true }, }), @@ -392,8 +404,8 @@ var _ = Describe("Marshaler", Ordered, func() { checker: check[bool], }, option: pref.WithHibernationBehaviourInclusiveSleep, - tweak: func(jo *json.Options) { - jo.Hibernate.Behaviour.InclusiveSleep = false + tweak: func(result *persist.MarshalResult) { + result.JO.Hibernate.Behaviour.InclusiveSleep = false }, }), @@ -410,8 +422,8 @@ var _ = Describe("Marshaler", Ordered, func() { option: func() pref.Option { return pref.WithNoW(5) }, - tweak: func(jo *json.Options) { - jo.Concurrency.NoW = 99 + tweak: func(result *persist.MarshalResult) { + result.JO.Concurrency.NoW = 99 }, }), ) @@ -419,7 +431,10 @@ var _ = Describe("Marshaler", Ordered, func() { Context("UnequalPtrError", func() { When("pref.Options is nil", func() { It("🧪 should: return UnequalPtrError", func() { - err := persist.Equals(nil, &json.Options{}) + err := persist.Equals(&persist.Comparison{ + JO: &json.Options{}, + }) + Expect(err).NotTo(Succeed()) Expect(errors.Is(err, locale.ErrUnEqualConversion)).To(BeTrue(), "error should be a locale.ErrUnEqualConversion", @@ -430,7 +445,11 @@ var _ = Describe("Marshaler", Ordered, func() { When("json FilterDef is nil", func() { It("🧪 should: return UnequalPtrError", func() { o, _, _ := opts.Get() - err := persist.Equals(o, nil) + + err := persist.Equals(&persist.Comparison{ + O: o, + }) + Expect(err).NotTo(Succeed()) Expect(errors.Is(err, locale.ErrUnEqualConversion)).To(BeTrue(), "error should be a locale.ErrUnEqualConversion", diff --git a/internal/persist/persist-suite_test.go b/internal/persist/persist-suite_test.go index 1964846..4c7ccda 100644 --- a/internal/persist/persist-suite_test.go +++ b/internal/persist/persist-suite_test.go @@ -8,7 +8,6 @@ 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/internal/persist" "github.com/snivilised/traverse/pref" ) @@ -49,8 +48,8 @@ type ( } tampered struct { - o *pref.Options - jo *json.Options + o *pref.Options + result *persist.MarshalResult } checkerFunc func(entry *checkerTE, err error) error diff --git a/internal/types/definitions.go b/internal/types/definitions.go index b6c9d05..8532b80 100644 --- a/internal/types/definitions.go +++ b/internal/types/definitions.go @@ -189,3 +189,8 @@ type ( func (fn FilterChildrenFunc) Matching(files []fs.DirEntry) []fs.DirEntry { return fn(files) } + +func (s *ActiveState) Clone() *ActiveState { + c := *s + return &c +}