From b1d1d998487c6aaf50d228893f55540fc2671cce Mon Sep 17 00:00:00 2001 From: adcondev <38170282+adcondev@users.noreply.github.com> Date: Thu, 12 Feb 2026 21:53:00 +0000 Subject: [PATCH] test(composer): add PrintLn unit tests Added unit tests for the `PrintLn` function in `pkg/composer/escpos_composer.go`. Implemented a `mockPrintCapability` to test the `PrintLn` function in isolation. Covered both success and error scenarios. Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> --- pkg/composer/escpos_composer_test.go | 160 +++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 pkg/composer/escpos_composer_test.go diff --git a/pkg/composer/escpos_composer_test.go b/pkg/composer/escpos_composer_test.go new file mode 100644 index 0000000..783c58f --- /dev/null +++ b/pkg/composer/escpos_composer_test.go @@ -0,0 +1,160 @@ +package composer + +import ( + "bytes" + "errors" + "testing" +) + +// ============================================================================ +// Mocks +// ============================================================================ + +type mockPrintCapability struct { + textFn func(string) ([]byte, error) + printAndLineFeedFn func() []byte + printAndCarriageReturnFn func() []byte + formFeedFn func() []byte + printAndFeedPaperFn func(byte) []byte + printAndFeedLinesFn func(byte) []byte + printAndReverseFeedFn func(byte) ([]byte, error) + printAndReverseFeedLinesFn func(byte) ([]byte, error) + printDataInPageModeFn func() []byte + cancelDataFn func() []byte +} + +func (m *mockPrintCapability) Text(text string) ([]byte, error) { + if m.textFn != nil { + return m.textFn(text) + } + return nil, nil +} + +func (m *mockPrintCapability) PrintAndLineFeed() []byte { + if m.printAndLineFeedFn != nil { + return m.printAndLineFeedFn() + } + return nil +} + +func (m *mockPrintCapability) PrintAndCarriageReturn() []byte { + if m.printAndCarriageReturnFn != nil { + return m.printAndCarriageReturnFn() + } + return nil +} + +func (m *mockPrintCapability) FormFeed() []byte { + if m.formFeedFn != nil { + return m.formFeedFn() + } + return nil +} + +func (m *mockPrintCapability) PrintAndFeedPaper(units byte) []byte { + if m.printAndFeedPaperFn != nil { + return m.printAndFeedPaperFn(units) + } + return nil +} + +func (m *mockPrintCapability) PrintAndFeedLines(lines byte) []byte { + if m.printAndFeedLinesFn != nil { + return m.printAndFeedLinesFn(lines) + } + return nil +} + +func (m *mockPrintCapability) PrintAndReverseFeed(units byte) ([]byte, error) { + if m.printAndReverseFeedFn != nil { + return m.printAndReverseFeedFn(units) + } + return nil, nil +} + +func (m *mockPrintCapability) PrintAndReverseFeedLines(lines byte) ([]byte, error) { + if m.printAndReverseFeedLinesFn != nil { + return m.printAndReverseFeedLinesFn(lines) + } + return nil, nil +} + +func (m *mockPrintCapability) PrintDataInPageMode() []byte { + if m.printDataInPageModeFn != nil { + return m.printDataInPageModeFn() + } + return nil +} + +func (m *mockPrintCapability) CancelData() []byte { + if m.cancelDataFn != nil { + return m.cancelDataFn() + } + return nil +} + +// ============================================================================ +// Tests +// ============================================================================ + +func TestEscposProtocol_PrintLn(t *testing.T) { + tests := []struct { + name string + input string + mockText func(string) ([]byte, error) + mockPrintFeed func() []byte + want []byte + wantErr bool + }{ + { + name: "success", + input: "Hello World", + mockText: func(s string) ([]byte, error) { + return []byte(s), nil + }, + mockPrintFeed: func() []byte { + return []byte{0x0A} + }, + want: []byte("Hello World\n"), + wantErr: false, + }, + { + name: "text error", + input: "Error", + mockText: func(s string) ([]byte, error) { + return nil, errors.New("mock error") + }, + mockPrintFeed: func() []byte { + return []byte{0x0A} + }, + want: nil, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup mock + mock := &mockPrintCapability{ + textFn: tt.mockText, + printAndLineFeedFn: tt.mockPrintFeed, + } + + // Create protocol with mock + c := &EscposProtocol{ + Print: mock, + } + + got, err := c.PrintLn(tt.input) + + if (err != nil) != tt.wantErr { + t.Errorf("PrintLn() error = %v, wantErr %v", err, tt.wantErr) + return + } + + if !tt.wantErr && !bytes.Equal(got, tt.want) { + t.Errorf("PrintLn() = %v, want %v", got, tt.want) + } + }) + } +}