Politics, Weather, Photography, and the Dog
Monday 30 December 2013

I just saved myself hours of pain by creating a unit test around a simple method that turned out to have a subtle bug.

The method in question calculates the price difference between two subscriptions for a product. If you're using the product, and you use more of it, the cost goes up. Every day, the application looks to make sure you're only using your allotted amount. If you go over, you get automatically bumped to the next subscription level and charged the difference, pro-rated by how much of the subscription term is left.

Here's the basic code:

var delta = subscription.IsAnnual ? 
   newTier.AnnualPrice - currentTier.AnnualPrice : 
   newTier.MonthlyPrice - currentTier.MonthlyPrice;

All well and good, except MonthlyPrice, for reasons known only to the previous developer, is nullable. So in order to prevent an ugly error message, I made sure it could never be null using the ?? operator:

var delta = subscription.IsAnnual ? 
   newTier.AnnualPrice - currentTier.AnnualPrice : 
   newTier.MonthlyPrice ?? 0m - currentTier.MonthlyPrice ?? 0m;

Do you see the problem? I didn't. But I learned today that - takes precedence over ??. So here's the correction:

var delta = subscription.IsAnnual ? 
   newTier.AnnualPrice - currentTier.AnnualPrice : 
   (newTier.MonthlyPrice ?? 0m) - (currentTier.MonthlyPrice ?? 0m);

I discovered that when the unit test I wrote kept insisting that 6 - 6 = 6. This is because without the parentheses where I put them, the compiler thinks I meant this:

newTier.MonthlyPrice ?? ((0m - currentTier.MonthlyPrice) ?? 0m)

In English, the compiler thought my first attempt meant, "Take the new monthly price, except if it's null, in which case take zero minus the old monthly price, unless that's null too, in which case take zero." What I meant, and what my correction means, is, "Take the new monthly price, or zero if it's null, and subtract the old monthly price (or zero if that's null)."

I'm glad I use NUnit.

Monday 30 December 2013 14:02:01 CST (UTC-06:00)  | Comments [0] | Software#
On this page....
Another bit of sanity brought to you by unit testing
The Daily Parker +3077d 18h 51m
To San Francisco 36d 04h 52m
Parker's 8th birthday 58d 18h 22m
My next birthday 139d 16h 39m
Aviation (300) Baseball (100) Best Bars (4) Biking (42) Chicago (824) Cubs (179) Duke (131) Geography (300) Higher Ground (5) Jokes (282) Kitchen Sink (577) London (32) Parker (180) Daily (204) Photography (134) Politics (302) US (1015) World (223) Raleigh (20) Readings (8) Religion (61) San Francisco (77) Software (185) Blogs (67) Business (203) Cloud (79) Cool links (122) Security (94) Travel (139) Weather (652) Astronomy (72) Windows Azure (46) Work (26) Writing (7)
<April 2014>
Full archive
David Braverman and Parker
David Braverman is a software developer in Chicago, and the creator of Weather Now. Parker is the most adorable dog on the planet, 80% of the time.
All content Copyright ©2014 David Braverman.
Creative Commons License
The Daily Parker by David Braverman is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License, excluding photographs, which may not be republished unless otherwise noted.
Admin Login
Sign In
Blog Stats
Total Posts: 4261
This Year: 159
This Month: 24
This Week: 8
Comments: 0