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)
+ }
+ })
+ }
+}