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 65414b2e74 feat(plc4go/cbus): expose bridge addressing in tags
65414b2e74 is described below

commit 65414b2e741e2c3cfd4aef744ac328976d93d96c
Author: Sebastian Rühl <[email protected]>
AuthorDate: Mon Mar 27 16:49:06 2023 +0200

    feat(plc4go/cbus): expose bridge addressing in tags
---
 plc4go/internal/cbus/Subscriber.go      |   4 +-
 plc4go/internal/cbus/Tag.go             | 118 +++----
 plc4go/internal/cbus/TagHandler.go      | 115 ++++---
 plc4go/internal/cbus/TagHandler_test.go | 579 ++++++++++++++++++++++++++++++++
 4 files changed, 709 insertions(+), 107 deletions(-)

diff --git a/plc4go/internal/cbus/Subscriber.go 
b/plc4go/internal/cbus/Subscriber.go
index 885ab1da65..4b3c77da97 100644
--- a/plc4go/internal/cbus/Subscriber.go
+++ b/plc4go/internal/cbus/Subscriber.go
@@ -117,7 +117,7 @@ func (m *Subscriber) handleMonitoredMMI(calReply 
readWriteModel.CALReply) bool {
                        tagName := subscriptionHandle.tagName
 
                        if unitAddress := tag.GetUnitAddress(); unitAddress != 
nil {
-                               unitSuffix := fmt.Sprintf("u%d", 
(*unitAddress).GetAddress())
+                               unitSuffix := fmt.Sprintf("u%d", 
unitAddress.GetAddress())
                                if !strings.HasSuffix(unitAddressString, 
unitSuffix) {
                                        log.Debug().Msgf("Current address 
string %s has not the suffix %s", unitAddressString, unitSuffix)
                                        continue
@@ -275,7 +275,7 @@ func (m *Subscriber) handleMonitoredSal(sal 
readWriteModel.MonitoredSAL) bool {
                                salData = sal.GetSalData()
                        }
                        if unitAddress := tag.GetUnitAddress(); unitAddress != 
nil {
-                               unitSuffix := fmt.Sprintf("u%d", 
(*unitAddress).GetAddress())
+                               unitSuffix := fmt.Sprintf("u%d", 
unitAddress.GetAddress())
                                if !strings.HasSuffix(unitAddressString, 
unitSuffix) {
                                        log.Debug().Msgf("Current address 
string %s has not the suffix %s", unitAddressString, unitSuffix)
                                        continue
diff --git a/plc4go/internal/cbus/Tag.go b/plc4go/internal/cbus/Tag.go
index 0f3965d89f..0d556effb3 100644
--- a/plc4go/internal/cbus/Tag.go
+++ b/plc4go/internal/cbus/Tag.go
@@ -24,10 +24,10 @@ import (
        "encoding/binary"
        "fmt"
 
-       "github.com/apache/plc4x/plc4go/pkg/api/model"
-       "github.com/apache/plc4x/plc4go/pkg/api/values"
+       apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
+       apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
        readWriteModel 
"github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
-       model2 "github.com/apache/plc4x/plc4go/spi/model"
+       spiModel "github.com/apache/plc4x/plc4go/spi/model"
        "github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -49,7 +49,7 @@ func (s StatusRequestType) String() string {
 }
 
 type Tag interface {
-       model.PlcTag
+       apiModel.PlcTag
 
        GetTagType() TagType
 }
@@ -128,7 +128,7 @@ type CALGetStatusTag interface {
 func NewCALGetStatusTag(unitAddress readWriteModel.UnitAddress, 
bridgeAddresses []readWriteModel.BridgeAddress, parameter 
readWriteModel.Parameter, count uint8, numElements uint16) CALGetStatusTag {
        return &calGetStatusTag{
                calTag:      calTag{bridgeAddresses, unitAddress},
-               tagType:     CAL_RECALL,
+               tagType:     CAL_GETSTATUS,
                parameter:   parameter,
                count:       count,
                numElements: numElements,
@@ -158,11 +158,11 @@ func NewSALTag(bridgeAddresses 
[]readWriteModel.BridgeAddress, application readW
 type SALMonitorTag interface {
        Tag
 
-       GetUnitAddress() *readWriteModel.UnitAddress
+       GetUnitAddress() readWriteModel.UnitAddress
        GetApplication() *readWriteModel.ApplicationIdContainer
 }
 
-func NewSALMonitorTag(unitAddress *readWriteModel.UnitAddress, application 
*readWriteModel.ApplicationIdContainer, numElements uint16) SALMonitorTag {
+func NewSALMonitorTag(unitAddress readWriteModel.UnitAddress, application 
*readWriteModel.ApplicationIdContainer, numElements uint16) SALMonitorTag {
        return &salMonitorTag{
                tagType:     SAL_MONITOR,
                unitAddress: unitAddress,
@@ -175,11 +175,11 @@ func NewSALMonitorTag(unitAddress 
*readWriteModel.UnitAddress, application *read
 type MMIMonitorTag interface {
        Tag
 
-       GetUnitAddress() *readWriteModel.UnitAddress
+       GetUnitAddress() readWriteModel.UnitAddress
        GetApplication() *readWriteModel.ApplicationIdContainer
 }
 
-func NewMMIMonitorTag(unitAddress *readWriteModel.UnitAddress, application 
*readWriteModel.ApplicationIdContainer, numElements uint16) SALMonitorTag {
+func NewMMIMonitorTag(unitAddress readWriteModel.UnitAddress, application 
*readWriteModel.ApplicationIdContainer, numElements uint16) SALMonitorTag {
        return &mmiMonitorTag{
                tagType:     MMI_STATUS_MONITOR,
                unitAddress: unitAddress,
@@ -241,14 +241,14 @@ type salTag struct {
 
 type salMonitorTag struct {
        tagType     TagType
-       unitAddress *readWriteModel.UnitAddress
+       unitAddress readWriteModel.UnitAddress
        application *readWriteModel.ApplicationIdContainer
        numElements uint16
 }
 
 type mmiMonitorTag struct {
        tagType     TagType
-       unitAddress *readWriteModel.UnitAddress
+       unitAddress readWriteModel.UnitAddress
        application *readWriteModel.ApplicationIdContainer
        numElements uint16
 }
@@ -275,20 +275,20 @@ func (s statusTag) GetAddressString() string {
        return fmt.Sprintf("status/%s/%s", statusRequestType, s.application)
 }
 
-func (s statusTag) GetValueType() values.PlcValueType {
-       return values.NULL
+func (s statusTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.NULL
 }
 
-func (s statusTag) GetArrayInfo() []model.ArrayInfo {
+func (s statusTag) GetArrayInfo() []apiModel.ArrayInfo {
        if s.numElements != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(s.numElements),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (s statusTag) GetTagType() TagType {
@@ -416,20 +416,20 @@ func (c calRecallTag) GetAddressString() string {
        return fmt.Sprintf("cal/%d/recall=%s", c.unitAddress.GetAddress(), 
c.parameter)
 }
 
-func (c calRecallTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (c calRecallTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (c calRecallTag) GetArrayInfo() []model.ArrayInfo {
+func (c calRecallTag) GetArrayInfo() []apiModel.ArrayInfo {
        if c.count != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(c.count),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (c calRecallTag) GetTagType() TagType {
@@ -483,20 +483,20 @@ func (c calIdentifyTag) GetAddressString() string {
        return fmt.Sprintf("cal/%d/identify=%s", c.unitAddress.GetAddress(), 
c.GetAttribute())
 }
 
-func (c calIdentifyTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (c calIdentifyTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (c calIdentifyTag) GetArrayInfo() []model.ArrayInfo {
+func (c calIdentifyTag) GetArrayInfo() []apiModel.ArrayInfo {
        if c.numElements != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(c.numElements),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (c calIdentifyTag) GetTagType() TagType {
@@ -550,20 +550,20 @@ func (c calGetStatusTag) GetAddressString() string {
        return fmt.Sprintf("cal/getstatus=%s, %d", c.parameter, c.GetCount())
 }
 
-func (c calGetStatusTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (c calGetStatusTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (c calGetStatusTag) GetArrayInfo() []model.ArrayInfo {
+func (c calGetStatusTag) GetArrayInfo() []apiModel.ArrayInfo {
        if c.count != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(c.count),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (c calGetStatusTag) GetTagType() TagType {
@@ -625,20 +625,20 @@ func (s salTag) GetAddressString() string {
        return fmt.Sprintf("sal/%s/%s", s.application, s.salCommand)
 }
 
-func (s salTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (s salTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (s salTag) GetArrayInfo() []model.ArrayInfo {
+func (s salTag) GetArrayInfo() []apiModel.ArrayInfo {
        if s.numElements != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(s.numElements),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (s salTag) GetTagType() TagType {
@@ -697,7 +697,7 @@ func (s salTag) String() string {
 func (s salMonitorTag) GetAddressString() string {
        unitAddress := "*"
        if s.unitAddress != nil {
-               unitAddress = fmt.Sprintf("%d", (*s.unitAddress).GetAddress())
+               unitAddress = fmt.Sprintf("%d", s.unitAddress.GetAddress())
        }
        application := "*"
        if s.application != nil {
@@ -706,27 +706,27 @@ func (s salMonitorTag) GetAddressString() string {
        return fmt.Sprintf("salmonitor/%s/%s", unitAddress, application)
 }
 
-func (s salMonitorTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (s salMonitorTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (s salMonitorTag) GetArrayInfo() []model.ArrayInfo {
+func (s salMonitorTag) GetArrayInfo() []apiModel.ArrayInfo {
        if s.numElements != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(s.numElements),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (s salMonitorTag) GetTagType() TagType {
        return s.tagType
 }
 
-func (s salMonitorTag) GetUnitAddress() *readWriteModel.UnitAddress {
+func (s salMonitorTag) GetUnitAddress() readWriteModel.UnitAddress {
        return s.unitAddress
 }
 
@@ -748,7 +748,7 @@ func (s salMonitorTag) SerializeWithWriteBuffer(ctx 
context.Context, writeBuffer
        }
 
        if unitAddress := s.unitAddress; unitAddress != nil {
-               if err := (*unitAddress).SerializeWithWriteBuffer(ctx, 
writeBuffer); err != nil {
+               if err := unitAddress.SerializeWithWriteBuffer(ctx, 
writeBuffer); err != nil {
                        return err
                }
        }
@@ -775,7 +775,7 @@ func (s salMonitorTag) String() string {
 func (m mmiMonitorTag) GetAddressString() string {
        unitAddress := "*"
        if m.unitAddress != nil {
-               unitAddress = fmt.Sprintf("%d", (*m.unitAddress).GetAddress())
+               unitAddress = fmt.Sprintf("%d", m.unitAddress.GetAddress())
        }
        application := "*"
        if m.application != nil {
@@ -784,27 +784,27 @@ func (m mmiMonitorTag) GetAddressString() string {
        return fmt.Sprintf("mmimonitor/%s/%s", unitAddress, application)
 }
 
-func (m mmiMonitorTag) GetValueType() values.PlcValueType {
-       return values.Struct
+func (m mmiMonitorTag) GetValueType() apiValues.PlcValueType {
+       return apiValues.Struct
 }
 
-func (m mmiMonitorTag) GetArrayInfo() []model.ArrayInfo {
+func (m mmiMonitorTag) GetArrayInfo() []apiModel.ArrayInfo {
        if m.numElements != 1 {
-               return []model.ArrayInfo{
-                       model2.DefaultArrayInfo{
+               return []apiModel.ArrayInfo{
+                       spiModel.DefaultArrayInfo{
                                LowerBound: 0,
                                UpperBound: uint32(m.numElements),
                        },
                }
        }
-       return []model.ArrayInfo{}
+       return []apiModel.ArrayInfo{}
 }
 
 func (m mmiMonitorTag) GetTagType() TagType {
        return m.tagType
 }
 
-func (m mmiMonitorTag) GetUnitAddress() *readWriteModel.UnitAddress {
+func (m mmiMonitorTag) GetUnitAddress() readWriteModel.UnitAddress {
        return m.unitAddress
 }
 
@@ -826,7 +826,7 @@ func (m mmiMonitorTag) SerializeWithWriteBuffer(ctx 
context.Context, writeBuffer
        }
 
        if unitAddress := m.unitAddress; unitAddress != nil {
-               if err := (*unitAddress).SerializeWithWriteBuffer(ctx, 
writeBuffer); err != nil {
+               if err := unitAddress.SerializeWithWriteBuffer(ctx, 
writeBuffer); err != nil {
                        return err
                }
        }
diff --git a/plc4go/internal/cbus/TagHandler.go 
b/plc4go/internal/cbus/TagHandler.go
index 70510ae1ca..7f0e1a6c3e 100644
--- a/plc4go/internal/cbus/TagHandler.go
+++ b/plc4go/internal/cbus/TagHandler.go
@@ -26,7 +26,7 @@ import (
        "strconv"
        "strings"
 
-       "github.com/apache/plc4x/plc4go/pkg/api/model"
+       apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
        readWriteModel 
"github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
        "github.com/apache/plc4x/plc4go/spi/utils"
        "github.com/pkg/errors"
@@ -36,20 +36,15 @@ type TagType uint8
 
 //go:generate stringer -type TagType
 const (
-       STATUS TagType = iota
-       // TODO: implement
-       CAL_RESET
+       STATUS    TagType = iota
+       CAL_RESET         /* TODO: implement me*/
        CAL_RECALL
        CAL_IDENTIFY
        CAL_GETSTATUS
-       // TODO: implement
-       CAL_WRITE
-       // TODO: implement
-       CAL_IDENTIFY_REPLY
-       // TODO: implement
-       CAL_STATUS
-       // TODO: implement
-       CAL_STATUS_EXTENDED
+       CAL_WRITE           /* TODO: implement me*/
+       CAL_IDENTIFY_REPLY  /* TODO: implement me*/
+       CAL_STATUS          /* TODO: implement me*/
+       CAL_STATUS_EXTENDED /* TODO: implement me*/
        SAL
        SAL_MONITOR
        MMI_STATUS_MONITOR
@@ -71,12 +66,12 @@ type TagHandler struct {
 
 func NewTagHandler() TagHandler {
        return TagHandler{
-               statusRequestPattern: 
regexp.MustCompile(`^status/(?P<statusRequestType>(?P<binary>binary)|level=0x(?P<startingGroupAddressLabel>00|20|40|60|80|A0|C0|E0))/(?P<application>.*)`),
-               calPattern:           
regexp.MustCompile(`^cal/(?P<unitAddress>.+)/(?P<calType>reset|recall=\[(?P<recallParamNo>\w+),
 
?(?P<recallCount>\d+)]|identify=(?P<identifyAttribute>\w+)|getStatus=(?P<getStatusParamNo>\w+),
 ?(?P<getStatusCount>\d+)|write=\[(?P<writeParamNo>\w+), 
?(?P<writeCode>0[xX][0-9a-fA-F][0-9a-fA-F])]|identifyReply=(?P<replyAttribute>\w+)|reply=(?P<replyParamNo>\w+)|status=(?P<statusApplication>.*)|statusExtended=(?P<statusExtendedApplication>.*))`),
-               salPattern:           
regexp.MustCompile(`^sal/(?P<application>.*)/(?P<salCommand>.*)`),
-               salMonitorPattern:    
regexp.MustCompile(`^salmonitor/(?P<unitAddress>.+)/(?P<application>.+)`),
-               mmiMonitorPattern:    
regexp.MustCompile(`^mmimonitor/(?P<unitAddress>.+)/(?P<application>.+)`),
-               unityQuery:           
regexp.MustCompile(`^info/(?P<unitAddress>.+)/(?P<identifyAttribute>.+)`),
+               statusRequestPattern: 
regexp.MustCompile(`^status/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})/)?(?P<statusRequestType>(?P<binary>binary)|level=0x(?P<startingGroupAddressLabel>00|20|40|60|80|A0|C0|E0))/(?P<application>.*)$`),
+               calPattern:           
regexp.MustCompile(`^cal/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})-)?(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<calType>reset|recall=\[(?P<recallParamNo>\w+),
 
?(?P<recallCount>\d+)]|identify=(?P<identifyAttribute>\w+)|getStatus=(?P<getStatusParamNo>\w+),
 ?(?P<getStatusCount>\d+)|write=\[(?P<writeParamNo>\w+), 
?(?P<writeCode>0[xX][0-9a-fA-F][0-9a-fA-F])]|identifyReply=(?P<replyAttribute>\w+)|r
 [...]
+               salPattern:           
regexp.MustCompile(`^sal/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})/)?(?P<application>.*)/(?P<salCommand>.*)$`),
+               salMonitorPattern:    
regexp.MustCompile(`^salmonitor/(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<application>.+)$`),
+               mmiMonitorPattern:    
regexp.MustCompile(`^mmimonitor/(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<application>.+)$`),
+               unityQuery:           
regexp.MustCompile(`^info/(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<identifyAttribute>.+)$`),
        }
 }
 
@@ -112,7 +107,7 @@ var PossibleSalCommands = 
map[readWriteModel.ApplicationId][]CommandAndArguments
        readWriteModel.ApplicationId_HVAC_ACTUATOR:                      
c2nl(readWriteModel.LightingCommandTypeValues),
 }
 
-func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) {
+func (m TagHandler) ParseTag(tagAddress string) (apiModel.PlcTag, error) {
        if match := utils.GetSubgroupMatches(m.statusRequestPattern, 
tagAddress); match != nil {
                return m.handleStatusRequestPattern(match)
        } else if match := utils.GetSubgroupMatches(m.calPattern, tagAddress); 
match != nil {
@@ -128,7 +123,7 @@ func (m TagHandler) ParseTag(tagAddress string) 
(model.PlcTag, error) {
        }
 }
 
-func (m TagHandler) ParseQuery(query string) (model.PlcQuery, error) {
+func (m TagHandler) ParseQuery(query string) (apiModel.PlcQuery, error) {
        if match := utils.GetSubgroupMatches(m.unityQuery, query); match != nil 
{
                return m.handleUnitQuery(match)
        } else {
@@ -136,9 +131,11 @@ func (m TagHandler) ParseQuery(query string) 
(model.PlcQuery, error) {
        }
 }
 
-func (m TagHandler) handleStatusRequestPattern(match map[string]string) 
(model.PlcTag, error) {
-       var bridgeAddresses []readWriteModel.BridgeAddress
-       // TODO: extract bridge addresses
+func (m TagHandler) handleStatusRequestPattern(match map[string]string) 
(apiModel.PlcTag, error) {
+       bridgeAddresses, err := extractBridges(match)
+       if err != nil {
+               return nil, errors.Wrap(err, "error extracting bridges")
+       }
        var startingGroupAddressLabel *byte
        var statusRequestType StatusRequestType
        statusRequestArgument := match["statusRequestType"]
@@ -164,9 +161,10 @@ func (m TagHandler) handleStatusRequestPattern(match 
map[string]string) (model.P
        return NewStatusTag(bridgeAddresses, statusRequestType, 
startingGroupAddressLabel, application, 1), nil
 }
 
-func (m TagHandler) handleCalPattern(match map[string]string) (model.PlcTag, 
error) {
+func (m TagHandler) handleCalPattern(match map[string]string) 
(apiModel.PlcTag, error) {
        var unitAddress readWriteModel.UnitAddress
        unitAddressArgument := match["unitAddress"]
+       unitAddressArgument = strings.TrimPrefix(unitAddressArgument, "u")
        if strings.HasPrefix(unitAddressArgument, "0x") {
                decodedHex, err := hex.DecodeString(unitAddressArgument[2:])
                if err != nil {
@@ -183,8 +181,10 @@ func (m TagHandler) handleCalPattern(match 
map[string]string) (model.PlcTag, err
                }
                unitAddress = readWriteModel.NewUnitAddress(byte(atoi))
        }
-       var bridgeAddresses []readWriteModel.BridgeAddress
-       // TODO: extract bridge addresses
+       bridgeAddresses, err := extractBridges(match)
+       if err != nil {
+               return nil, errors.Wrap(err, "error extracting bridges")
+       }
 
        calTypeArgument := match["calType"]
        switch {
@@ -290,9 +290,11 @@ func (m TagHandler) handleCalPattern(match 
map[string]string) (model.PlcTag, err
        }
 }
 
-func (m TagHandler) handleSALPattern(match map[string]string) (model.PlcTag, 
error) {
-       var bridgeAddresses []readWriteModel.BridgeAddress
-       // TODO: extract bridge addresses
+func (m TagHandler) handleSALPattern(match map[string]string) 
(apiModel.PlcTag, error) {
+       bridgeAddresses, err := extractBridges(match)
+       if err != nil {
+               return nil, errors.Wrap(err, "error extracting bridges")
+       }
        application, err := applicationIdFromArgument(match["application"])
        if err != nil {
                return nil, errors.Wrap(err, "Error getting application id from 
argument")
@@ -316,10 +318,11 @@ func (m TagHandler) handleSALPattern(match 
map[string]string) (model.PlcTag, err
        return NewSALTag(bridgeAddresses, application, salCommand, 
numElements), nil
 }
 
-func (m TagHandler) handleSALMonitorPattern(match map[string]string) 
(model.PlcTag, error) {
-       var unitAddress *readWriteModel.UnitAddress
+func (m TagHandler) handleSALMonitorPattern(match map[string]string) 
(apiModel.PlcTag, error) {
+       var unitAddress readWriteModel.UnitAddress
        {
                unitAddressArgument := match["unitAddress"]
+               unitAddressArgument = strings.TrimPrefix(unitAddressArgument, 
"u")
                if unitAddressArgument == "*" {
                        unitAddress = nil
                } else if strings.HasPrefix(unitAddressArgument, "0x") {
@@ -330,17 +333,13 @@ func (m TagHandler) handleSALMonitorPattern(match 
map[string]string) (model.PlcT
                        if len(decodedHex) != 1 {
                                return nil, errors.Errorf("Hex must be exatly 
one byte")
                        }
-                       var unitAddressVar readWriteModel.UnitAddress
-                       unitAddressVar = 
readWriteModel.NewUnitAddress(decodedHex[0])
-                       unitAddress = &unitAddressVar
+                       unitAddress = 
readWriteModel.NewUnitAddress(decodedHex[0])
                } else {
                        atoi, err := strconv.ParseUint(unitAddressArgument, 10, 
8)
                        if err != nil {
                                return nil, errors.Errorf("Unknown unit address 
%s", unitAddressArgument)
                        }
-                       var unitAddressVar readWriteModel.UnitAddress
-                       unitAddressVar = 
readWriteModel.NewUnitAddress(byte(atoi))
-                       unitAddress = &unitAddressVar
+                       unitAddress = readWriteModel.NewUnitAddress(byte(atoi))
                }
        }
 
@@ -361,10 +360,11 @@ func (m TagHandler) handleSALMonitorPattern(match 
map[string]string) (model.PlcT
        return NewSALMonitorTag(unitAddress, application, 1), nil
 }
 
-func (m TagHandler) handleMMIMonitorPattern(match map[string]string) 
(model.PlcTag, error) {
-       var unitAddress *readWriteModel.UnitAddress
+func (m TagHandler) handleMMIMonitorPattern(match map[string]string) 
(apiModel.PlcTag, error) {
+       var unitAddress readWriteModel.UnitAddress
        {
                unitAddressArgument := match["unitAddress"]
+               unitAddressArgument = strings.TrimPrefix(unitAddressArgument, 
"u")
                if unitAddressArgument == "*" {
                        unitAddress = nil
                } else if strings.HasPrefix(unitAddressArgument, "0x") {
@@ -375,17 +375,13 @@ func (m TagHandler) handleMMIMonitorPattern(match 
map[string]string) (model.PlcT
                        if len(decodedHex) != 1 {
                                return nil, errors.Errorf("Hex must be exatly 
one byte")
                        }
-                       var unitAddressVar readWriteModel.UnitAddress
-                       unitAddressVar = 
readWriteModel.NewUnitAddress(decodedHex[0])
-                       unitAddress = &unitAddressVar
+                       unitAddress = 
readWriteModel.NewUnitAddress(decodedHex[0])
                } else {
                        atoi, err := strconv.ParseUint(unitAddressArgument, 10, 
8)
                        if err != nil {
                                return nil, errors.Errorf("Unknown unit address 
%s", unitAddressArgument)
                        }
-                       var unitAddressVar readWriteModel.UnitAddress
-                       unitAddressVar = 
readWriteModel.NewUnitAddress(byte(atoi))
-                       unitAddress = &unitAddressVar
+                       unitAddress = readWriteModel.NewUnitAddress(byte(atoi))
                }
        }
 
@@ -406,9 +402,10 @@ func (m TagHandler) handleMMIMonitorPattern(match 
map[string]string) (model.PlcT
        return NewMMIMonitorTag(unitAddress, application, 1), nil
 }
 
-func (m TagHandler) handleUnitQuery(match map[string]string) (model.PlcQuery, 
error) {
+func (m TagHandler) handleUnitQuery(match map[string]string) 
(apiModel.PlcQuery, error) {
        var unitAddress *readWriteModel.UnitAddress
        unitAddressArgument := match["unitAddress"]
+       unitAddressArgument = strings.TrimPrefix(unitAddressArgument, "u")
        if unitAddressArgument == "*" {
                unitAddress = nil
        } else if strings.HasPrefix(unitAddressArgument, "0x") {
@@ -548,3 +545,29 @@ func c2nl[T CommandAndArgumentsCount](t []T) 
[]CommandAndArgumentsCount {
        }
        return result
 }
+
+func extractBridges(match map[string]string) ([]readWriteModel.BridgeAddress, 
error) {
+       var bridgeAddresses []readWriteModel.BridgeAddress
+       if match["bridges"] != "" {
+               for _, bridge := range strings.Split(match["bridges"], "-") {
+                       bridge = strings.TrimPrefix(bridge, "b")
+                       if strings.HasPrefix(bridge, "0x") {
+                               decodedHex, err := hex.DecodeString(bridge[2:])
+                               if err != nil {
+                                       return nil, errors.Wrap(err, "Not a 
valid hex")
+                               }
+                               if len(decodedHex) != 1 {
+                                       return nil, errors.Errorf("Hex must be 
exatly one byte")
+                               }
+                               bridgeAddresses = append(bridgeAddresses, 
readWriteModel.NewBridgeAddress(decodedHex[0]))
+                       } else {
+                               atoi, err := strconv.ParseUint(bridge, 10, 8)
+                               if err != nil {
+                                       return nil, errors.Errorf("Unknown 
bridge address %s", bridge)
+                               }
+                               bridgeAddresses = append(bridgeAddresses, 
readWriteModel.NewBridgeAddress(byte(atoi)))
+                       }
+               }
+       }
+       return bridgeAddresses, nil
+}
diff --git a/plc4go/internal/cbus/TagHandler_test.go 
b/plc4go/internal/cbus/TagHandler_test.go
new file mode 100644
index 0000000000..27f833c1ee
--- /dev/null
+++ b/plc4go/internal/cbus/TagHandler_test.go
@@ -0,0 +1,579 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package cbus
+
+import (
+       apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
+       readWriteModel 
"github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
+       "github.com/stretchr/testify/assert"
+       "reflect"
+       "regexp"
+       "testing"
+)
+
+func TestNewTagHandler(t *testing.T) {
+       tests := []struct {
+               name          string
+               wantValidator func(t *testing.T, handler TagHandler)
+       }{
+               {
+                       name: "simple",
+                       wantValidator: func(t *testing.T, handler TagHandler) {
+                               assert.NotNil(t, handler.statusRequestPattern)
+                               assert.NotNil(t, handler.calPattern)
+                               assert.NotNil(t, handler.salPattern)
+                               assert.NotNil(t, handler.salMonitorPattern)
+                               assert.NotNil(t, handler.mmiMonitorPattern)
+                               assert.NotNil(t, handler.unityQuery)
+                       },
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       got := NewTagHandler()
+                       tt.wantValidator(t, got)
+               })
+       }
+}
+
+func TestTagHandler_ParseTag(t *testing.T) {
+       type args struct {
+               tagAddress string
+       }
+       tests := []struct {
+               name    string
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               {
+                       name:    "empty",
+                       wantErr: true,
+               },
+               {
+                       name:    "nonsense",
+                       args:    args{tagAddress: "gobblegobble"},
+                       wantErr: true,
+               },
+               {
+                       name: "status request",
+                       args: args{tagAddress: "status/binary/LIGHTING"},
+                       want: &statusTag{
+                               bridgeAddresses:           nil,
+                               tagType:                   STATUS,
+                               statusRequestType:         
StatusRequestTypeBinaryState,
+                               startingGroupAddressLabel: nil,
+                               application:               
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               numElements:               1,
+                       },
+               },
+               {
+                       name: "cal get status",
+                       args: args{tagAddress: "cal/2/getStatus=1,2"},
+                       want: &calGetStatusTag{
+                               calTag: calTag{
+                                       bridgeAddresses: nil,
+                                       unitAddress:     
readWriteModel.NewUnitAddress(2),
+                               },
+                               tagType:     CAL_GETSTATUS,
+                               parameter:   1,
+                               count:       2,
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "sal light on",
+                       args: args{tagAddress: "sal/LIGHTING/ON"},
+                       want: &salTag{
+                               tagType:     SAL,
+                               application: 
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               salCommand:  "ON",
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "sal monitor",
+                       args: args{tagAddress: "salmonitor/2/LIGHTING"},
+                       want: &salMonitorTag{
+                               tagType:     SAL_MONITOR,
+                               unitAddress: readWriteModel.NewUnitAddress(2),
+                               application: func() 
*readWriteModel.ApplicationIdContainer {
+                                       lighting_38 := 
readWriteModel.ApplicationIdContainer_LIGHTING_38
+                                       return &lighting_38
+                               }(),
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "mmi monitor",
+                       args: args{tagAddress: "mmimonitor/2/LIGHTING"},
+                       want: &mmiMonitorTag{
+                               tagType:     MMI_STATUS_MONITOR,
+                               unitAddress: readWriteModel.NewUnitAddress(2),
+                               application: func() 
*readWriteModel.ApplicationIdContainer {
+                                       lighting_38 := 
readWriteModel.ApplicationIdContainer_LIGHTING_38
+                                       return &lighting_38
+                               }(),
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "bridged status 1 bridge",
+                       args: args{tagAddress: "status/b1/binary/LIGHTING"},
+                       want: &statusTag{
+                               bridgeAddresses:           
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1)},
+                               tagType:                   STATUS,
+                               statusRequestType:         
StatusRequestTypeBinaryState,
+                               startingGroupAddressLabel: nil,
+                               application:               
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               numElements:               1,
+                       },
+               },
+               {
+                       name: "bridged status 6 bridges",
+                       args: args{tagAddress: 
"status/b1-b2-b3-b4-b5-b6/binary/LIGHTING"},
+                       want: &statusTag{
+                               bridgeAddresses:           
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1), 
readWriteModel.NewBridgeAddress(2), readWriteModel.NewBridgeAddress(3), 
readWriteModel.NewBridgeAddress(4), readWriteModel.NewBridgeAddress(5), 
readWriteModel.NewBridgeAddress(6)},
+                               tagType:                   STATUS,
+                               statusRequestType:         
StatusRequestTypeBinaryState,
+                               startingGroupAddressLabel: nil,
+                               application:               
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               numElements:               1,
+                       },
+               },
+               {
+                       name: "bridged cal 1 bridge",
+                       args: args{tagAddress: "cal/b1-u2/getStatus=1,2"},
+                       want: &calGetStatusTag{
+                               calTag: calTag{
+                                       bridgeAddresses: 
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1)},
+                                       unitAddress:     
readWriteModel.NewUnitAddress(2),
+                               },
+                               tagType:     CAL_GETSTATUS,
+                               parameter:   1,
+                               count:       2,
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "bridged cal 6 bridges",
+                       args: args{tagAddress: 
"cal/b1-b2-b3-b4-b5-b6-u2/getStatus=1,2"},
+                       want: &calGetStatusTag{
+                               calTag: calTag{
+                                       bridgeAddresses: 
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1), 
readWriteModel.NewBridgeAddress(2), readWriteModel.NewBridgeAddress(3), 
readWriteModel.NewBridgeAddress(4), readWriteModel.NewBridgeAddress(5), 
readWriteModel.NewBridgeAddress(6)},
+                                       unitAddress:     
readWriteModel.NewUnitAddress(2),
+                               },
+                               tagType:     CAL_GETSTATUS,
+                               parameter:   1,
+                               count:       2,
+                               numElements: 1,
+                       },
+               },
+               {
+                       name: "sal light on 1 bridge",
+                       args: args{tagAddress: "sal/b1/LIGHTING/ON"},
+                       want: &salTag{
+                               bridgeAddresses: 
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1)},
+                               tagType:         SAL,
+                               application:     
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               salCommand:      "ON",
+                               numElements:     1,
+                       },
+               },
+               {
+                       name: "sal light on 6 bridges",
+                       args: args{tagAddress: 
"sal/b1-b2-b3-b4-b5-b6/LIGHTING/ON"},
+                       want: &salTag{
+                               bridgeAddresses: 
[]readWriteModel.BridgeAddress{readWriteModel.NewBridgeAddress(1), 
readWriteModel.NewBridgeAddress(2), readWriteModel.NewBridgeAddress(3), 
readWriteModel.NewBridgeAddress(4), readWriteModel.NewBridgeAddress(5), 
readWriteModel.NewBridgeAddress(6)},
+                               tagType:         SAL,
+                               application:     
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+                               salCommand:      "ON",
+                               numElements:     1,
+                       },
+               },
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := NewTagHandler()
+                       got, err := m.ParseTag(tt.args.tagAddress)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("ParseTag() error = %v, wantErr %v", 
err, tt.wantErr)
+                               return
+                       }
+                       assert.Equal(t, got, tt.want)
+               })
+       }
+}
+
+func TestTagHandler_ParseQuery(t *testing.T) {
+       type args struct {
+               query string
+       }
+       tests := []struct {
+               name    string
+               args    args
+               want    apiModel.PlcQuery
+               wantErr bool
+       }{
+               {
+                       name:    "empty",
+                       wantErr: true,
+               },
+               {
+                       name:    "nonsense",
+                       args:    args{query: "gobblegobble"},
+                       wantErr: true,
+               },
+               // TODO: other cases
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := NewTagHandler()
+                       got, err := m.ParseQuery(tt.args.query)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("ParseQuery() error = %v, wantErr %v", 
err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("ParseQuery() got = %v, want %v", got, 
tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleStatusRequestPattern(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleStatusRequestPattern(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleStatusRequestPattern() error = 
%v, wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleStatusRequestPattern() got = 
%v, want %v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleCalPattern(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleCalPattern(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleCalPattern() error = %v, 
wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleCalPattern() got = %v, want 
%v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleMMIMonitorPattern(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleMMIMonitorPattern(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleMMIMonitorPattern() error = %v, 
wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleMMIMonitorPattern() got = %v, 
want %v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleSALMonitorPattern(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleSALMonitorPattern(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleSALMonitorPattern() error = %v, 
wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleSALMonitorPattern() got = %v, 
want %v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleSALPattern(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcTag
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleSALPattern(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleSALPattern() error = %v, 
wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleSALPattern() got = %v, want 
%v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagHandler_handleUnitQuery(t *testing.T) {
+       type fields struct {
+               statusRequestPattern *regexp.Regexp
+               calPattern           *regexp.Regexp
+               salPattern           *regexp.Regexp
+               salMonitorPattern    *regexp.Regexp
+               mmiMonitorPattern    *regexp.Regexp
+               unityQuery           *regexp.Regexp
+       }
+       type args struct {
+               match map[string]string
+       }
+       tests := []struct {
+               name    string
+               fields  fields
+               args    args
+               want    apiModel.PlcQuery
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       m := TagHandler{
+                               statusRequestPattern: 
tt.fields.statusRequestPattern,
+                               calPattern:           tt.fields.calPattern,
+                               salPattern:           tt.fields.salPattern,
+                               salMonitorPattern:    
tt.fields.salMonitorPattern,
+                               mmiMonitorPattern:    
tt.fields.mmiMonitorPattern,
+                               unityQuery:           tt.fields.unityQuery,
+                       }
+                       got, err := m.handleUnitQuery(tt.args.match)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("handleUnitQuery() error = %v, wantErr 
%v", err, tt.wantErr)
+                               return
+                       }
+                       if !reflect.DeepEqual(got, tt.want) {
+                               t.Errorf("handleUnitQuery() got = %v, want %v", 
got, tt.want)
+                       }
+               })
+       }
+}
+
+func TestTagType_GetName(t *testing.T) {
+       tests := []struct {
+               name string
+               i    TagType
+               want string
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       if got := tt.i.GetName(); got != tt.want {
+                               t.Errorf("GetName() = %v, want %v", got, 
tt.want)
+                       }
+               })
+       }
+}
+
+func Test_applicationIdFromArgument(t *testing.T) {
+       type args struct {
+               applicationIdArgument string
+       }
+       tests := []struct {
+               name    string
+               args    args
+               want    readWriteModel.ApplicationIdContainer
+               wantErr bool
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       got, err := 
applicationIdFromArgument(tt.args.applicationIdArgument)
+                       if (err != nil) != tt.wantErr {
+                               t.Errorf("applicationIdFromArgument() error = 
%v, wantErr %v", err, tt.wantErr)
+                               return
+                       }
+                       if got != tt.want {
+                               t.Errorf("applicationIdFromArgument() got = %v, 
want %v", got, tt.want)
+                       }
+               })
+       }
+}
+
+func Test_c2nl(t *testing.T) {
+       type args struct {
+               t []CommandAndArgumentsCount
+       }
+       tests := []struct {
+               name string
+               args args
+               want []CommandAndArgumentsCount
+       }{
+               // TODO: Add test cases.
+       }
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       if got := c2nl(tt.args.t); !reflect.DeepEqual(got, 
tt.want) {
+                               t.Errorf("c2nl() = %v, want %v", got, tt.want)
+                       }
+               })
+       }
+}


Reply via email to