You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2024/09/04 21:34:03 UTC

(plc4x) branch develop updated: feat(plc4go/spi): improve testlogger output for multiline stringers

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 3d853b153a feat(plc4go/spi): improve testlogger output for multiline stringers
3d853b153a is described below

commit 3d853b153a287d7b1f273d76bddfc19475a71f0a
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Sep 4 23:33:57 2024 +0200

    feat(plc4go/spi): improve testlogger output for multiline stringers
---
 plc4go/spi/testutils/TestUtils.go      | 67 ++++++++++++++++++++++++++++------
 plc4go/spi/testutils/TestUtils_test.go | 19 ++++++++++
 2 files changed, 74 insertions(+), 12 deletions(-)

diff --git a/plc4go/spi/testutils/TestUtils.go b/plc4go/spi/testutils/TestUtils.go
index a2e68fdd41..4e6cdb2d1c 100644
--- a/plc4go/spi/testutils/TestUtils.go
+++ b/plc4go/spi/testutils/TestUtils.go
@@ -201,25 +201,68 @@ func ProduceTestingLogger(t TestingLog) zerolog.Logger {
 		},
 		func(w *zerolog.ConsoleWriter) {
 			w.FormatFieldValue = func(i interface{}) string {
-				if aString, ok := i.(string); ok && strings.Contains(aString, "\\n") {
-					if noColor {
-						return "see below"
-					} else {
-						return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
+				switch i := i.(type) {
+				case string:
+					if strings.Contains(i, "\\n") {
+						if noColor {
+							return "see below"
+						} else {
+							return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
+						}
+					}
+				case []uint8:
+					if len(i) > 4 && i[0] == '[' && i[len(i)-1] == ']' && strings.Contains(string(i), "\\n") {
+						if noColor {
+							return "see below"
+						} else {
+							return fmt.Sprintf("\x1b[%dm%v\x1b[0m", 31, "see below")
+						}
 					}
 				}
 				return fmt.Sprintf("%s", i)
 			}
 			w.FormatExtra = func(m map[string]interface{}, buffer *bytes.Buffer) error {
 				for key, i := range m {
-					if aString, ok := i.(string); ok && strings.Contains(aString, "\n") {
-						buffer.WriteString("\n")
-						if noColor {
-							buffer.WriteString("field " + key)
-						} else {
-							buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
+					switch i := i.(type) {
+					case string:
+						if strings.Contains(i, "\n") {
+							buffer.WriteString("\n")
+							if noColor {
+								buffer.WriteString("field " + key)
+							} else {
+								buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
+							}
+							buffer.WriteString(":\n" + i)
+						}
+					case []any:
+						allStrings := false
+						containsNewLine := false
+						stringsElems := make([]string, len(i))
+						for i, elem := range i {
+							if aString, ok := elem.(string); ok {
+								containsNewLine = containsNewLine || strings.Contains(aString, "\n")
+								allStrings = true
+								stringsElems[i] = strings.Trim(aString, "\n")
+							} else {
+								allStrings = false
+								break
+							}
+						}
+						if allStrings && containsNewLine {
+							buffer.WriteString("\n")
+							if noColor {
+								buffer.WriteString("field " + key)
+							} else {
+								buffer.WriteString(fmt.Sprintf("\x1b[%dm%v\x1b[0m", 32, "field "+key))
+							}
+							var sb strings.Builder
+							for j, elem := range stringsElems {
+								sb.WriteString(strconv.Itoa(j) + ":\n")
+								sb.WriteString(elem)
+								sb.WriteString("\n")
+							}
+							buffer.WriteString(":\n" + sb.String())
 						}
-						buffer.WriteString(":\n" + aString)
 					}
 				}
 				return nil
diff --git a/plc4go/spi/testutils/TestUtils_test.go b/plc4go/spi/testutils/TestUtils_test.go
index d18dff6d56..1196aa2194 100644
--- a/plc4go/spi/testutils/TestUtils_test.go
+++ b/plc4go/spi/testutils/TestUtils_test.go
@@ -21,6 +21,7 @@ package testutils
 
 import (
 	"context"
+	"fmt"
 	"testing"
 	"time"
 
@@ -95,11 +96,29 @@ func TestProduceTestingLogger_ASerializableLog(t *testing.T) {
 		Msg("something")
 }
 
+type TestProduceTestingLoggerImprovedOutputMultilineStringer struct {
+}
+
+func (TestProduceTestingLoggerImprovedOutputMultilineStringer) String() string {
+	return "\nthis\nthis\nthis\nthis\nthis\nthis\n"
+}
+
 func TestProduceTestingLogger_Improved_Output(t *testing.T) {
 	t.Run("multilinestring", func(t *testing.T) {
 		logger := ProduceTestingLogger(t)
 		logger.Info().Str("amultiline", "a\nb\nc").Msg("look at that")
 	})
+	t.Run("multilinestringer", func(t *testing.T) {
+		logger := ProduceTestingLogger(t)
+		logger.Info().Stringer("amultiline", TestProduceTestingLoggerImprovedOutputMultilineStringer{}).Msg("look at that")
+	})
+	t.Run("multilinestringers", func(t *testing.T) {
+		logger := ProduceTestingLogger(t)
+		logger.Info().Stringers("amultiline", []fmt.Stringer{
+			TestProduceTestingLoggerImprovedOutputMultilineStringer{},
+			TestProduceTestingLoggerImprovedOutputMultilineStringer{},
+		}).Msg("look at that")
+	})
 }
 
 func Test__explodingGlobalLogger_Write(t *testing.T) {