New data converter: *divide

This commit is contained in:
DanB
2018-05-28 15:13:09 +02:00
parent 0f4ac37dda
commit 64f6a4f42e
2 changed files with 61 additions and 6 deletions

View File

@@ -66,6 +66,11 @@ func NewDataConverter(params string) (
return NewMultiplyConverter("")
}
return NewMultiplyConverter(params[len(MetaMultiply)+1:])
case strings.HasPrefix(params, MetaDivide):
if len(params) == len(MetaDivide) { // no extra params, defaults implied
return NewDivideConverter("")
}
return NewDivideConverter(params[len(MetaDivide)+1:])
default:
return nil,
fmt.Errorf("unsupported converter definition: <%s>",
@@ -159,3 +164,31 @@ func (m *MultiplyConverter) Convert(in interface{}) (
out = inFloat64 * m.Value
return
}
func NewDivideConverter(constructParams string) (
hdlr DataConverter, err error) {
if constructParams == "" {
return nil, ErrMandatoryIeMissingNoCaps
}
var val float64
if val, err = strconv.ParseFloat(constructParams, 64); err != nil {
return
}
return &DivideConverter{Value: val}, nil
}
// DivideConverter divides input with value in params
// encapsulates the output as float64 value
type DivideConverter struct {
Value float64
}
func (m *DivideConverter) Convert(in interface{}) (
out interface{}, err error) {
var inFloat64 float64
if inFloat64, err = IfaceAsFloat64(in); err != nil {
return nil, err
}
out = inFloat64 / m.Value
return
}

View File

@@ -38,7 +38,7 @@ func TestNewDataConverter(t *testing.T) {
}
func TestConvertFloatToSeconds(t *testing.T) {
b, err := NewDurationSecondsConverter("")
b, err := NewDataConverter(MetaDurationSeconds)
if err != nil {
t.Error(err.Error())
}
@@ -53,7 +53,7 @@ func TestConvertFloatToSeconds(t *testing.T) {
}
func TestRoundConverterFloat64(t *testing.T) {
b, err := NewRoundConverter("2")
b, err := NewDataConverter("*round:2")
if err != nil {
t.Error(err.Error())
}
@@ -77,7 +77,7 @@ func TestRoundConverterFloat64(t *testing.T) {
//testRoundconv string / float / int / time
func TestRoundConverterString(t *testing.T) {
b, err := NewRoundConverter("2")
b, err := NewDataConverter("*round:2")
if err != nil {
t.Error(err.Error())
}
@@ -99,7 +99,7 @@ func TestRoundConverterString(t *testing.T) {
}
func TestRoundConverterInt64(t *testing.T) {
b, err := NewRoundConverter("2")
b, err := NewDataConverter("*round:2")
if err != nil {
t.Error(err.Error())
}
@@ -121,7 +121,7 @@ func TestRoundConverterInt64(t *testing.T) {
}
func TestRoundConverterTime(t *testing.T) {
b, err := NewRoundConverter("2")
b, err := NewDataConverter("*round:2")
if err != nil {
t.Error(err.Error())
}
@@ -144,7 +144,7 @@ func TestRoundConverterTime(t *testing.T) {
func TestMultiplyConverter(t *testing.T) {
eMpl := &MultiplyConverter{1024.0}
m, err := NewMultiplyConverter("1024.0")
m, err := NewDataConverter("*multiply:1024.0")
if err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eMpl, m) {
@@ -163,3 +163,25 @@ func TestMultiplyConverter(t *testing.T) {
t.Errorf("expecting: %+v, received: %+v", expOut, out)
}
}
func TestDivideConverter(t *testing.T) {
eDvd := &DivideConverter{1024.0}
d, err := NewDataConverter("*divide:1024.0")
if err != nil {
t.Error(err)
} else if !reflect.DeepEqual(eDvd, d) {
t.Errorf("expecting: %+v, received: %+v", eDvd, d)
}
expOut := 2.0
if out, err := d.Convert(time.Duration(2048)); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expOut, out) {
t.Errorf("expecting: %+v, received: %+v", expOut, out)
}
expOut = 1.5
if out, err := d.Convert(1536.0); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(expOut, out) {
t.Errorf("expecting: %+v, received: %+v", expOut, out)
}
}