2022-07-11 23:41:58 -04:00
package data
2016-02-05 22:00:47 -08:00
import (
2016-02-06 19:13:54 -08:00
"bytes"
"testing"
2022-04-27 10:48:59 -04:00
2025-02-26 19:22:48 -05:00
"github.com/samber/oops"
2022-04-27 10:48:59 -04:00
"github.com/stretchr/testify/assert"
2016-02-05 22:00:47 -08:00
)
2016-02-06 19:13:54 -08:00
2022-07-14 16:05:48 -04:00
func TestValuesExclusesPairWithBadData ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-05-22 19:59:20 -04:00
bad_key , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x0c , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b , 0x00 } )
values := bad_key . Values ( )
2016-03-29 23:27:58 -07:00
2022-07-14 16:05:48 -04:00
e := WrapErrors ( errs )
t . Log ( e )
assert . NotNil ( errs , "Values() did not return errors when some values had bad key" )
2022-09-10 15:34:20 -04:00
if assert . Equal ( 1 , len ( values ) , "Values() did not return valid values when some values had bad key" ) {
2022-05-22 19:59:20 -04:00
k := values [ 0 ] [ 0 ]
key , _ := k . Data ( )
v := values [ 0 ] [ 1 ]
val , _ := v . Data ( )
2016-03-29 23:27:58 -07:00
assert . Equal ( key , "a" , "Values() returned by data with invalid key contains incorrect present key" )
assert . Equal ( val , "b" , "Values() returned by data with invalid key contains incorrect present key" )
2016-02-06 19:13:54 -08:00
}
2022-07-14 16:05:48 -04:00
}
2016-02-06 19:13:54 -08:00
func TestValuesWarnsMissingData ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-05-22 19:59:20 -04:00
_ , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 } )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
if assert . Equal ( 2 , len ( errs ) , "Values() reported wrong error count when mapping had missing data" ) {
assert . Equal ( errs [ 0 ] . Error ( ) , "warning parsing mapping: mapping length exceeds provided data" )
2016-02-06 19:13:54 -08:00
}
}
func TestValuesWarnsExtraData ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-09-10 15:34:20 -04:00
mapping , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b , 0x00 } )
values := mapping . Values ( )
key , kerr := values [ 0 ] [ 0 ] . Data ( )
val , verr := values [ 0 ] [ 1 ] . Data ( )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Nil ( kerr )
assert . Nil ( verr )
assert . Equal ( key , "a" , "Values() did not return key in valid data" )
assert . Equal ( val , "b" , "Values() did not return value in valid data" )
2024-11-17 21:39:31 -05:00
if assert . Equal ( 1 , len ( errs ) , "Values() reported wrong error count when mapping had extra data" ) {
2022-09-10 15:34:20 -04:00
assert . Equal ( "warning parsing mapping: data exists beyond length of mapping" , errs [ 0 ] . Error ( ) , "correct error message should be returned" )
2016-02-06 19:13:54 -08:00
}
}
func TestValuesEnforcesEqualDelimitor ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-07-11 10:33:33 -04:00
mapping , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x30 , 0x01 , 0x62 , 0x3b } )
values := mapping . Values ( )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
if assert . Equal ( 2 , len ( errs ) , "Values() reported wrong error count when mapping had = format error" ) {
assert . Equal ( "mapping format violation, expected =" , errs [ 0 ] . Error ( ) , "correct error message should be returned" )
2016-02-06 19:13:54 -08:00
}
2022-09-10 15:34:20 -04:00
assert . Equal ( 0 , len ( values ) , "Values() not empty with invalid data due to = format error" )
2016-02-06 19:13:54 -08:00
}
func TestValuesEnforcedSemicolonDelimitor ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-07-11 10:33:33 -04:00
mapping , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x30 } )
values := mapping . Values ( )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
if assert . Equal ( 2 , len ( errs ) , "Values() reported wrong error count when mapping had ; format error" ) {
assert . Equal ( "mapping format violation, expected ;" , errs [ 0 ] . Error ( ) , "correct error message should be returned" )
2016-02-06 19:13:54 -08:00
}
2022-09-10 15:34:20 -04:00
assert . Equal ( 0 , len ( values ) , "Values() not empty with invalid data due to ; format error" )
2016-02-06 19:13:54 -08:00
}
func TestValuesReturnsValues ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-07-11 10:33:33 -04:00
mapping , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b } )
values := mapping . Values ( )
2016-03-29 23:27:58 -07:00
key , kerr := values [ 0 ] [ 0 ] . Data ( )
val , verr := values [ 0 ] [ 1 ] . Data ( )
assert . Nil ( errs , "Values() returned a errors with parsing valid data" )
assert . Nil ( kerr )
assert . Nil ( verr )
2022-09-10 15:34:20 -04:00
assert . Equal ( "a" , key , "Values() did not return key in valid data" )
assert . Equal ( "b" , val , "Values() did not return value in valid data" )
2016-02-06 19:13:54 -08:00
}
2022-09-19 19:46:46 -04:00
func TestHasDuplicateKeysTrueWhenDuplicates ( t * testing . T ) {
assert := assert . New ( t )
dups , _ , _ := NewMapping ( [ ] byte { 0x00 , 0x0c , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b } )
assert . Equal ( true , dups . HasDuplicateKeys ( ) , "HasDuplicateKeys() did not report true when duplicate keys present" )
}
func TestHasDuplicateKeysFalseWithoutDuplicates ( t * testing . T ) {
assert := assert . New ( t )
mapping , _ , _ := NewMapping ( [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b } )
assert . Equal ( false , mapping . HasDuplicateKeys ( ) , "HasDuplicateKeys() did not report false when no duplicate keys present" )
}
2022-09-19 00:54:43 +00:00
func TestReadMappingHasDuplicateKeys ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2022-09-19 00:54:43 +00:00
_ , _ , errs := NewMapping ( [ ] byte { 0x00 , 0x0c , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b } )
2016-03-29 23:27:58 -07:00
2022-09-19 19:47:46 -04:00
assert . Equal ( "mapping format violation, duplicate key in mapping" , errs [ 0 ] . Error ( ) , "ReadMapping should throw an error when duplicate keys are present." )
2016-02-06 19:13:54 -08:00
}
func TestGoMapToMappingProducesCorrectMapping ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2016-02-06 19:13:54 -08:00
gomap := map [ string ] string { "a" : "b" }
mapping , err := GoMapToMapping ( gomap )
2016-03-29 23:27:58 -07:00
assert . Nil ( err , "GoMapToMapping() returned error with valid data" )
2016-02-06 19:13:54 -08:00
expected := [ ] byte { 0x00 , 0x06 , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b }
2022-07-11 10:33:33 -04:00
if bytes . Compare ( mapping . Data ( ) , expected ) != 0 {
2016-02-06 19:13:54 -08:00
t . Fatal ( "GoMapToMapping did not produce correct Mapping" , mapping , expected )
}
}
2022-09-10 15:34:20 -04:00
func TestFullGoMapToMappingProducesCorrectMapping ( t * testing . T ) {
assert := assert . New ( t )
gomap := map [ string ] string {
"a" : "b" ,
"c" : "d" ,
}
mapping , err := GoMapToMapping ( gomap )
assert . Nil ( err , "GoMapToMapping() returned error with valid data" )
expected := [ ] byte { 0x00 , 0x0c , 0x01 , 0x61 , 0x3d , 0x01 , 0x62 , 0x3b , 0x01 , 0x63 , 0x3d , 0x01 , 0x64 , 0x3b }
if bytes . Compare ( mapping . Data ( ) , expected ) != 0 {
t . Fatal ( "GoMapToMapping did not produce correct Mapping" , mapping , expected )
}
}
2016-02-06 19:13:54 -08:00
func TestStopValueReadTrueWhenCorrectErr ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2025-02-26 19:22:48 -05:00
status := stopValueRead ( oops . Errorf ( "error parsing string: zero length" ) )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Equal ( true , status , "stopValueRead() did not return true when String error found" )
2016-02-06 19:13:54 -08:00
}
func TestStopValueReadFalseWhenWrongErr ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2025-02-26 19:22:48 -05:00
status := stopValueRead ( oops . Errorf ( "something else" ) )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Equal ( false , status , "stopValueRead() did not return false when non String error found" )
2016-02-06 19:13:54 -08:00
}
func TestBeginsWithCorrectWhenTrue ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2016-02-06 19:13:54 -08:00
slice := [ ] byte { 0x41 }
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Equal ( true , beginsWith ( slice , 0x41 ) , "beginsWith() did not return true when correct" )
2016-02-06 19:13:54 -08:00
}
func TestBeginsWithCorrectWhenFalse ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2016-02-06 19:13:54 -08:00
slice := [ ] byte { 0x00 }
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Equal ( false , beginsWith ( slice , 0x41 ) , "beginsWith() did not false when incorrect" )
2016-02-06 19:13:54 -08:00
}
func TestBeginsWithCorrectWhenNil ( t * testing . T ) {
2016-03-29 23:27:58 -07:00
assert := assert . New ( t )
2016-02-06 19:13:54 -08:00
slice := make ( [ ] byte , 0 )
2016-03-29 23:27:58 -07:00
2022-09-10 15:34:20 -04:00
assert . Equal ( false , beginsWith ( slice , 0x41 ) , "beginsWith() did not return false on empty slice" )
2016-02-06 19:13:54 -08:00
}