From 4368f7713edb6a0fbbaeeaba156e493ab5468b19 Mon Sep 17 00:00:00 2001 From: mStar Date: Fri, 2 May 2025 15:18:14 +0200 Subject: [PATCH] Fix parser invalid results, add tests, readme - Fix parser not producing the correct results - Add tests for everything - Add readme with example Ready for v1 --- README.md | 44 ++++++++++++++++++++++++++++++ coverage_badge.png | Bin 0 -> 2483 bytes go.mod | 6 ++--- go.sum | 10 ++++--- informer_test.go | 17 ++++++++++++ node_test.go | 53 ++++++++++++++++++++++++++++++++++++ parser.go | 17 +++++++----- parser_test.go | 66 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 199 insertions(+), 14 deletions(-) create mode 100644 README.md create mode 100644 coverage_badge.png create mode 100644 informer_test.go create mode 100644 node_test.go create mode 100644 parser_test.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..a172936 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Treeificator + +![Go Coverage](https://git.mstar.dev/mstar/treeificator/raw/branch/main/coverage_badge.png) +[![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://git.mstar.dev/mstar/treeificator/src/branch/main/LICENSE) +[![Go Documentation](https://godocs.io/git.mstar.dev/mstar/treeificator?status.svg)](https://godocs.io/git.mstar.dev/mstar/treeificator) +[![GoDoc](https://pkg.go.dev/badge/git.mstar.dev/mstar/treeificator)](https://pkg.go.dev/git.mstar.dev/mstar/treeificator) + +A small module to turn a string into a tree of nodes based on a list of informers. + +## How to use + +First import the module `go get git.mstar.dev/mstar/treeificator` + +Then define the informers for the beginning and end of each node type you want + +```go +type PInformer struct{} + +// The prefix starting a block of type PInformer +func (p *PInformer) GetPrefix() string { + return "

" +} + +// The suffix ending a block of type PInformer +func (p *PInformer) GetSuffix() string { + return "

" +} + +// The name of PInformer +func (p *PInformer) GetName() string { + return "p-element" +} +``` + +And finally parse any string + +```go +import "git.mstar.dev/mstar/treeificator" + +treeRoot := treeificator.Marshal(yourString, &PInformer{}) +``` + +See [documentation](https://pkg.go.dev/git.mstar.dev/mstar/treeificator) +for more details diff --git a/coverage_badge.png b/coverage_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..22cc9fa86f95bda5ea03a0dcbeeaed77517df700 GIT binary patch literal 2483 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 0 { + b := strings.TrimSuffix(string(buffer), activeInformer.GetSuffix()) elements = append( elements, NodeElement{ Text: other.IntoPointer( - strings.TrimSuffix(string(buffer), activeInformer.GetSuffix()), + b, ), }, ) } - return elements, uint64(consumed) + return elements, uint64(consumed) + 1 } } if len(buffer) > 0 { diff --git a/parser_test.go b/parser_test.go new file mode 100644 index 0000000..ebea3d7 --- /dev/null +++ b/parser_test.go @@ -0,0 +1,66 @@ +package treeificator + +import "testing" + +type testInformer struct{} + +func (testinformer *testInformer) GetPrefix() string { + return "

" +} + +func (testinformer *testInformer) GetSuffix() string { + return "

" +} + +func (testinformer *testInformer) GetName() string { + return "tester" +} + +const testString = "some

sitrn

for testing" + +func TestMarshalOnlyRaw(t *testing.T) { + res := Marshal(testString) + if l := len(res.Elements); l != 1 { + t.Fatalf("Expected to have one element, got %v", l) + } + if res.NodeType.GetName() != "default" { + t.Fatalf("Expected root informer to be default, got %v instead", res.NodeType.GetName()) + } + elem := res.Elements[0] + if elem.Text == nil { + t.Fatalf("Expected one raw string element with test string, got nil") + } + if *elem.Text != testString { + t.Fatalf("Expected one raw string element with test string, got %#v", *elem.Text) + } +} + +func TestMarshalWithInformer(t *testing.T) { + res := Marshal(testString, &testInformer{}) + if len(res.Elements) != 3 { + t.Fatalf("Expected 3 elements (text, node, text), got %#v instead", res.Elements) + } + raw1 := res.Elements[0] + subElem := res.Elements[1] + raw2 := res.Elements[2] + if raw1.Text == nil || *raw1.Text != "some" { + t.Fatalf("Expected first element to be raw text \"some\", got %#v", raw1) + } + if raw2.Text == nil || *raw2.Text != "for testing" { + t.Fatalf("Expected last element to be raw text \"for testing\", got %#v", *raw2.Text) + } + if subElem.Node == nil { + t.Fatalf("Expected 2nd element to be a node, got %#v", subElem) + } + n := subElem.Node + if name := n.NodeType.GetName(); name != "tester" { + t.Fatalf("Expected 2nd element node type name to be \"tester\", got %#v", name) + } + if len(n.Elements) != 1 { + t.Fatalf("Expected 2nd element to have one element, got %#v", n.Elements) + } + ns := n.Elements[0] + if ns.Text == nil || *ns.Text != "sitrn" { + t.Fatalf("Expected 2nd element to have one raw text of \"sitrn\", got %#v", ns.Text) + } +}