diff --git a/Makefile b/Makefile index 17eb81a..1bbe44c 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ race: .PHONY: bench bench: ## Бенчмарки - go test -benchtime=10x -benchmem -bench=Benchmark ./... | grep allocs + go test -benchtime=3x -benchmem -bench=Benchmark ./... | grep allocs help: ## Print this help and exit @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/weghting_n_cutting_the_tree/README.md b/weighting_n_cutting_the_tree/README.md similarity index 100% rename from weghting_n_cutting_the_tree/README.md rename to weighting_n_cutting_the_tree/README.md diff --git a/weighting_n_cutting_the_tree/cutting.go b/weighting_n_cutting_the_tree/cutting.go new file mode 100644 index 0000000..d2666b5 --- /dev/null +++ b/weighting_n_cutting_the_tree/cutting.go @@ -0,0 +1,5 @@ +package main + +func DecomposeTree(tree map[string]*WeightedNode, threshold int) ([]SubTree, error) { + return []SubTree{{path: "/", tree: tree["1.0.0.0"].node}}, nil +} diff --git a/weighting_n_cutting_the_tree/cutting_test.go b/weighting_n_cutting_the_tree/cutting_test.go new file mode 100644 index 0000000..727f870 --- /dev/null +++ b/weighting_n_cutting_the_tree/cutting_test.go @@ -0,0 +1,32 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDecomposeTree(t *testing.T){ + for name, tt := range map[string]struct{ + inputTree map[string]*WeightedNode + inputThreshold int + outputParts []SubTree + err string + }{ + "Normal":{ + inputTree: smallTree.Tree, + inputThreshold: smallTree.Threshold, + outputParts: smallTree.Parts, + }, + }{ + t.Run(name, func(t *testing.T) { + result, err := DecomposeTree(tt.inputTree, tt.inputThreshold) + if tt.err == "" { + require.NoError(t, err) + require.ElementsMatch(t, result, tt.outputParts) + } else { + require.EqualError(t, err, tt.err) + } + }) + } +} diff --git a/weighting_n_cutting_the_tree/cutting_test_models.go b/weighting_n_cutting_the_tree/cutting_test_models.go new file mode 100644 index 0000000..8ac67ff --- /dev/null +++ b/weighting_n_cutting_the_tree/cutting_test_models.go @@ -0,0 +1,232 @@ +package main + +type testDecomposingData struct { + Tree map[string]*WeightedNode + Threshold int + Parts []SubTree +} + +var smallTree = testDecomposingData{ + Tree: tree3by3.WeightingTreeWithStack(), + Threshold: 2, + Parts: []SubTree{ + { + path: "/", + tree: tree3by3, + }, + }, +} + +var tree3by3 = &Node{ + ID: "1.0.0.0", + Name: "/", + Children: []*Node{ + { + ID: "1.1.0.0", + Name: "folder1", + Children: []*Node{ + { + ID: "1.1.1.0", + Name: "folder1", + Children: []*Node{ + { + ID: "1.1.1.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.1.1.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.1.1.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.1.2.0", + Name: "folder2", + Children: []*Node{ + { + ID: "1.1.2.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.1.2.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.1.2.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.1.3.0", + Name: "folder3", + Children: []*Node{ + { + ID: "1.1.3.1", + Name: "folder3", + Children: []*Node{}, + }, + { + ID: "1.1.3.2", + Name: "folder3", + Children: []*Node{}, + }, + { + ID: "1.1.3.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + }, + }, + { + ID: "1.2.0.0", + Name: "folder2", + Children: []*Node{ + { + ID: "1.2.1.0", + Name: "folder1", + Children: []*Node{ + { + ID: "1.2.1.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.2.1.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.2.1.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.2.2.0", + Name: "folder2", + Children: []*Node{ + { + ID: "1.2.2.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.2.2.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.2.2.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.2.3.0", + Name: "folder3", + Children: []*Node{ + { + ID: "1.2.3.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.2.3.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.2.3.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + }, + }, + { + ID: "1.3.0.0", + Name: "folder3", + Children: []*Node{ + { + ID: "1.3.1.0", + Name: "folder1", + Children: []*Node{ + { + ID: "1.3.1.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.3.1.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.3.1.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.3.2.0", + Name: "folder2", + Children: []*Node{ + { + ID: "1.3.2.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.3.2.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.3.2.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + { + ID: "1.3.3.0", + Name: "folder3", + Children: []*Node{ + { + ID: "1.3.3.1", + Name: "folder1", + Children: []*Node{}, + }, + { + ID: "1.3.3.2", + Name: "folder2", + Children: []*Node{}, + }, + { + ID: "1.3.3.3", + Name: "folder3", + Children: []*Node{}, + }, + }, + }, + }, + }, + }, +} diff --git a/weghting_n_cutting_the_tree/dll/dll.go b/weighting_n_cutting_the_tree/dll/dll.go similarity index 100% rename from weghting_n_cutting_the_tree/dll/dll.go rename to weighting_n_cutting_the_tree/dll/dll.go diff --git a/weghting_n_cutting_the_tree/dll/dll_test.go b/weighting_n_cutting_the_tree/dll/dll_test.go similarity index 100% rename from weghting_n_cutting_the_tree/dll/dll_test.go rename to weighting_n_cutting_the_tree/dll/dll_test.go diff --git a/weghting_n_cutting_the_tree/func_models.go b/weighting_n_cutting_the_tree/models.go similarity index 100% rename from weghting_n_cutting_the_tree/func_models.go rename to weighting_n_cutting_the_tree/models.go diff --git a/weghting_n_cutting_the_tree/funcs.go b/weighting_n_cutting_the_tree/weighting.go similarity index 93% rename from weghting_n_cutting_the_tree/funcs.go rename to weighting_n_cutting_the_tree/weighting.go index 97000e4..05146fc 100644 --- a/weghting_n_cutting_the_tree/funcs.go +++ b/weighting_n_cutting_the_tree/weighting.go @@ -2,7 +2,7 @@ package main import ( "maps" - "tests/weghting_n_cutting_the_tree/dll" + "tests/weighting_n_cutting_the_tree/dll" ) func (root *Node) WeightingTreeWithRecursion(parent *Node) map[string]*WeightedNode { @@ -103,7 +103,3 @@ func (root *Node) WeightingTreeWithDLL() map[string]*WeightedNode { return counter } - -func DecomposeTree(tree map[string]*WeightedNode, threshold int) ([]SubTree, error) { - return []SubTree{{path: "/", tree: tree["root"].node}}, nil -} diff --git a/weghting_n_cutting_the_tree/funcs_test.go b/weighting_n_cutting_the_tree/weighting_test.go similarity index 74% rename from weghting_n_cutting_the_tree/funcs_test.go rename to weighting_n_cutting_the_tree/weighting_test.go index 7dc8c73..b3fc6d7 100644 --- a/weghting_n_cutting_the_tree/funcs_test.go +++ b/weighting_n_cutting_the_tree/weighting_test.go @@ -2,7 +2,6 @@ package main import ( "fmt" -"github.com/stretchr/testify/require" "sort" "testing" @@ -10,9 +9,9 @@ import ( ) func TestNode_WeighingTreeAllAlgo(t *testing.T) { - for name,tt := range map[string]TestTree{ - "Ordinary VFS tree": getTestTree(3, 3, nil), - "VFS in the form of a pathological tree":getTestTree(1, 7, nil), + for name,tt := range map[string]WeightedTree{ + "Ordinary VFS tree": getWeightedTree(3, 3, nil), + "VFS in the form of a pathological tree":getWeightedTree(1, 7, nil), }{ t.Run(name,func(t *testing.T) { t.Run("WeightingTreeWithRecursion", func(t *testing.T) { @@ -34,31 +33,6 @@ func TestNode_WeighingTreeAllAlgo(t *testing.T) { } } -func TestDecomposeTree(t *testing.T){ - for name, tt := range map[string]struct{ - inputTree map[string]*WeightedNode - inputThreshold int - outputParts []SubTree - err string - }{ - "Normal":{ - inputTree: smallTree.Tree, - inputThreshold: smallTree.Threshold, - outputParts: smallTree.Parts, - }, - }{ - t.Run(name, func(t *testing.T) { - result, err := DecomposeTree(tt.inputTree, tt.inputThreshold) - if tt.err == "" { - require.NoError(t, err) - require.ElementsMatch(t, result, tt.outputParts) - } else { - require.EqualError(t, err, tt.err) - } - }) - } -} - func Benchmark(b *testing.B) { b.StopTimer() b.ResetTimer() @@ -73,9 +47,9 @@ func Benchmark(b *testing.B) { "Pathological tree (10K nodes)": {1, 10000}, // 10'000 nodes, }{ b.Run(name, func(b *testing.B) { - tree := getTestTree(tt.branches, tt.depth, nil) + tree := getWeightedTree(tt.branches, tt.depth, nil) b.Cleanup(func() { - tree = TestTree{nil, nil} + tree = WeightedTree{nil, nil} }) b.Run("Weighing with recursion", func(b *testing.B) { for i := 0; i < b.N; i++ { diff --git a/weghting_n_cutting_the_tree/test_models.go b/weighting_n_cutting_the_tree/weighting_test_models.go similarity index 59% rename from weghting_n_cutting_the_tree/test_models.go rename to weighting_n_cutting_the_tree/weighting_test_models.go index 8fa6a6f..b602d04 100644 --- a/weghting_n_cutting_the_tree/test_models.go +++ b/weighting_n_cutting_the_tree/weighting_test_models.go @@ -5,14 +5,14 @@ import ( "maps" ) -type TestTree struct { +type WeightedTree struct { Tree *Node Weights map[string]*WeightedNode } -func getTestTree(branches, depth int, parent *Node) TestTree { +func getWeightedTree(branches, depth int, parent *Node) WeightedTree { if depth == 0 { - return TestTree{} + return WeightedTree{} } id := uuid.NewString() node := &Node{ @@ -20,7 +20,7 @@ func getTestTree(branches, depth int, parent *Node) TestTree { Name: id, Children: []*Node{}, } - tree := TestTree{ + tree := WeightedTree{ Tree: node, Weights: map[string]*WeightedNode{id: &WeightedNode{ node: node, @@ -30,7 +30,7 @@ func getTestTree(branches, depth int, parent *Node) TestTree { }}, } for i := 0; i < branches; i++ { - childTree := getTestTree(branches, depth-1, node) + childTree := getWeightedTree(branches, depth-1, node) if childTree.Tree != nil { tree.Tree.Children = append(tree.Tree.Children, childTree.Tree) tree.Weights[id].children = append(tree.Weights[id].children, childTree.Tree) @@ -42,30 +42,3 @@ func getTestTree(branches, depth int, parent *Node) TestTree { } return tree } - -type testDecomposingData struct { - Tree map[string]*WeightedNode - Threshold int - Parts []SubTree -} - -var smallTree = testDecomposingData{ - Tree: map[string]*WeightedNode{ - "root": { - node: &Node{ - ID: "root", - Name: "root", - }, - }, - }, - Threshold: 2, - Parts: []SubTree{ - { - path: "/", - tree: &Node{ - ID: "root", - Name: "root", - }, - }, - }, -}