smarty / assertions

Fluent assertion-style functions used by goconvey and gunit. Can also be used in any test or application.
Other
100 stars 34 forks source link

ShouldEqual does not compare time.Time correctly #15

Closed kofalt closed 7 years ago

kofalt commented 7 years ago

It appears that two time.Time objects cannot be compared with ShouldEqual:

base1 := time.Now()
base2 := base1

// Fails
So(base1, ShouldEqual, base2)

// A workaround - this will pass
So(base1, ShouldHappenWithin, time.Duration(0), base2)

Output:

Expected: '2017-02-13 17:21:18.997107497 -0600 CST'
Actual:   '2017-02-13 17:21:18.997107497 -0600 CST'
(Should be equal)

Arguably an upstream issue - jacobsa/oglematchers#25 mentions this. An easy fix would be to use time.Equal.

mdwhatcott commented 7 years ago

@kofalt - Have you tried using ShouldResemble?

kofalt commented 7 years ago

I'm not certain that's the best solution for time - as an example of a failing test:

Expected: 'time.Time{sec:63622625561, nsec:458973075, loc:(*time.Location){name:"Local", zone:[]time.zone{time.zone{name:"LMT", offset:-21036, isDST:false}, time.zone{name:"CDT", offset:-18000, isDST:true}, time.zone{name:"CST", offset:-21600, isDST:false}, time.zone{name:"EST", offset:-18000, isDST:false}, time.zone{name:"CWT", offset:-18000, isDST:true}, time.zone{name:"CPT", offset:-18000, isDST:true}, time.zone{name:"CST", offset:-21600, isDST:false}}, tx:[]time.zoneTrans{time.zoneTrans{when:-2147483648, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1633276800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1615136400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1601827200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1583686800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1563724800, index:1, isstd:true, isutc:true}, time.zoneTrans{when:-1551632400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1538928000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1520182800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1504454400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1491757200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1473004800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1459702800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1441555200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1428253200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1410105600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1396803600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1378656000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1365354000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1347206400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1333904400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1315152000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1301850000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1283702400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1270400400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1252252800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1238950800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1220803200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1207501200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1189353600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1176051600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1157299200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1144602000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1125849600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1112547600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1094400000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1081098000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1067788800, index:3, isstd:false, isutc:false}, time.zoneTrans{when:-1045414800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1031500800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-1018198800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-1000051200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-986749200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-967996800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-955299600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-936547200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-923245200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-905097600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-891795600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-880214400, index:4, isstd:false, isutc:false}, time.zoneTrans{when:-769395600, index:5, isstd:false, isutc:false}, time.zoneTrans{when:-765392400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-747244800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-733942800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-715795200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-702493200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-684345600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-671043600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-652896000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-639594000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-620841600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-608144400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-589392000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-576090000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-557942400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-544640400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-526492800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-513190800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-495043200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-481741200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-463593600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-447267600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-431539200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-415818000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-400089600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-384368400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-368640000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-352918800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-337190400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-321469200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-305740800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-289414800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-273686400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-257965200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-242236800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-226515600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-210787200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-195066000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-179337600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-163616400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-147888000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-131562000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-116438400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-100112400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-84384000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-68662800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-52934400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-37213200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:-21484800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:-5763600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:9964800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:25686000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:41414400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:57740400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:73468800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:89190000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:104918400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:120639600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:126691200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:152089200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:162374400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:183538800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:199267200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:215593200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:230716800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:247042800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:262771200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:278492400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:294220800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:309942000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:325670400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:341391600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:357120000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:372841200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:388569600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:404895600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:420019200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:436345200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:452073600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:467794800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:483523200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:499244400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:514972800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:530694000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:544608000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:562143600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:576057600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:594198000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:607507200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:625647600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:638956800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:657097200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:671011200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:688546800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:702460800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:719996400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:733910400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:752050800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:765360000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:783500400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:796809600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:814950000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:828864000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:846399600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:860313600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:877849200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:891763200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:909298800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:923212800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:941353200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:954662400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:972802800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:986112000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1004252400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1018166400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1035702000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1049616000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1067151600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1081065600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1099206000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1112515200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1130655600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1143964800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1162105200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1173600000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1194159600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1205049600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1225609200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1236499200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1257058800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1268553600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1289113200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1300003200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1320562800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1331452800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1352012400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1362902400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1383462000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1394352000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1414911600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1425801600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1446361200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1457856000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1478415600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1489305600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1509865200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1520755200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1541314800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1552204800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1572764400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1583654400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1604214000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1615708800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1636268400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1647158400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1667718000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1678608000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1699167600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1710057600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1730617200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1741507200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1762066800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1772956800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1793516400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1805011200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1825570800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1836460800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1857020400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1867910400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1888470000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1899360000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1919919600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1930809600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1951369200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1962864000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:1983423600, index:2, isstd:false, isutc:false}, time.zoneTrans{when:1994313600, index:1, isstd:false, isutc:false}, time.zoneTrans{when:2014873200, index:2, isstd:false, isutc:false}, time.zoneTrans{when:2025763200, index:1, isstd:false, isutc:false}, time.zoneTrans{when:2046322800, index:2, isstd:false, isutc:false}, time.zoneTrans{when:2057212800, index:1, isstd:false, isutc:false}, time.zoneTrans{when:2077772400, index:2, isstd:false, isutc:false}, time.zoneTrans{when:2088662400, index:1, isstd:false, isutc:false}, time.zoneTrans{when:2109222000, index:2, isstd:false, isutc:false}, time.zoneTrans{when:2120112000, index:1, isstd:false, isutc:false}, time.zoneTrans{when:2140671600, index:2, isstd:false, isutc:false}}, cacheStart:1478415600, cacheEnd:1489305600, cacheZone:(*time.zone){name:"CST", offset:-21600, isDST:false}}}'
Actual:   'time.Time{sec:63622625561, nsec:437000000, loc:(*time.Location){name:"", zone:[]time.zone{time.zone{name:"", offset:0, isDST:false}}, tx:[]time.zoneTrans{time.zoneTrans{when:-9223372036854775808, index:0, isstd:false, isutc:false}}, cacheStart:-9223372036854775808, cacheEnd:9223372036854775807, cacheZone:(*time.zone){name:"", offset:0, isDST:false}}}'
(Should resemble)!

The output & functionality would probably be more precise using time.Equal, since the time.Location struct field can have so much stuff on it. My guess is that it wouldn't work for comparing a time object that came from a Go source with a time object inflated from an external source.

That said, for my use case, ShouldResemble works well enough, and I'm not sure what sort of lines you want to draw about struct comparisons and the like. Feel free to close or leave open as desired :slightly_smiling_face:

mdwhatcott commented 7 years ago

Yeah, comparing time values is annoying. I was hoping that ShouldResemble would work for your use case.

Your workaround (using ShouldHappenWithin is actually pretty nice (hadn't seen that approach before--thanks for sharing!). It's probably better than doing something like So(time.Equal(t1, t2), ShouldBeTrue).

I think I'll continue using workarounds until such time as oglematchers handles this for us.