units.sql 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. BEGIN;
  2. CALL insert_unit ('fl. oz. (US)', 'Volume');
  3. CALL insert_unit ('Pint (US)', 'Volume');
  4. CALL insert_unit ('Tbsp (US)', 'Volume');
  5. CALL insert_unit ('tsp (US)', 'Volume');
  6. CALL insert_unit ('Cup (US)', 'Volume');
  7. CALL insert_unit ('Cup (US Legal)', 'Volume');
  8. CALL insert_unit ('Quart (US)', 'Volume');
  9. CALL insert_unit ('Gallon (US)', 'Volume');
  10. CALL insert_unit ('tsp (metric)', 'Volume');
  11. CALL insert_unit ('Tbsp (metric)', 'Volume');
  12. CALL insert_unit ('Cup (metric)', 'Volume');
  13. SELECT * FROM units;
  14. -- using customary cup as per https://en.wikipedia.org/wiki/Cup_(unit)
  15. CALL insert_unit_conversion ('tsp (metric)', 'mL', 5);
  16. CALL insert_unit_conversion ('Tbsp (metric)', 'mL', 15);
  17. CALL insert_unit_conversion ('Cup (metric)', 'mL', 250);
  18. CALL insert_unit_conversion ('Cup (US)', 'mL', 236.5882365);
  19. CALL insert_unit_conversion ('Cup (US Legal)', 'mL', 240);
  20. CALL insert_unit_conversion ('Cup (US)', 'Tbsp (US)', 16);
  21. CALL insert_unit_conversion ('Cup (US)', 'tsp (US)', 48);
  22. CALL insert_unit_conversion ('Cup (US)', 'fl. oz. (US)', 8);
  23. CALL insert_unit_conversion ('Pint (US)', 'Cup (US)', 2);
  24. CALL insert_unit_conversion ('Quart (US)', 'Cup (US)', 4);
  25. CALL insert_unit_conversion ('Gallon (US)', 'Cup (US)', 16);
  26. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Whole Oats', 0.214/2);
  27. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Puffed Rice', .03);
  28. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Coconut Desiccated', .071*2);
  29. -- CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Peanut butter', .24);
  30. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Honey', .68);
  31. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Brown Sugar', .055*4);
  32. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Red Lentils', .199);
  33. CALL insert_unit_conversion ('L', 'kg', 'Coconut Oil', .95);
  34. CALL insert_unit_conversion ('Cup (metric)', 'kg', 'Brown Rice', .19);
  35. SELECT * FROM conversions;
  36. DO
  37. $$
  38. DECLARE
  39. item record;
  40. msg text;
  41. expected numeric(20,10);
  42. result numeric(20,10);
  43. BEGIN
  44. FOR item IN SELECT * FROM (VALUES
  45. ('L', 'mL', '', 1000), -- *
  46. ('mL', 'L', '', 1.0/1000),
  47. ('tsp (metric)', 'mL', '', 5), -- *
  48. ('Tbsp (metric)', 'mL', '', 15), -- *
  49. ('Cup (metric)', 'mL', '', 250), -- *
  50. ('Cup (US)', 'tsp (metric)', '', 236.5882365/5),
  51. ('Cup (US)', 'Tbsp (metric)', '', 236.5882365/15),
  52. ('Cup (US Legal)', 'mL', '', 240), -- *
  53. ('Cup (US Legal)', 'Tbsp (metric)', '', 16),
  54. ('L', 'Cup (metric)', '', 4),
  55. ('Cup (US)', 'Cup (metric)', '', 236.5882365/250),
  56. ('Cup (US)', 'mL', '', 236.5882365),
  57. ('mL', 'Cup (US)', '', 1/236.5882365), -- *
  58. ('L', 'Cup (US)', '', 1000/236.5882365),
  59. ('Cup (US)', 'Tbsp (US)', '', 16), -- *
  60. ('mL', 'Tbsp (US)', '', 16/236.5882365),
  61. ('Tbsp (US)', 'tsp (US)', '', 3), -- *
  62. ('mL', 'tsp (US)', '', 16*3/236.5882365),
  63. ('Pint (US)', 'fl. oz. (US)', '', 16), -- *
  64. ('Pint (US)', 'Cup (US)', '', 2), -- *
  65. ('Cup (US)', 'fl. oz. (US)', '', 8),
  66. ('fl. oz. (US)', 'Tbsp (US)', '', 16*2/16),
  67. ('fl. oz. (US)', 'tsp (US)', '', 16*2*3/16),
  68. ('Quart (US)', 'fl. oz. (US)', '', 32), -- *
  69. ('fl. oz. (US)', 'Quart (US)', '', 1.0/32),
  70. ('Gallon (US)', 'fl. oz. (US)', '', 128),
  71. ('Gallon (US)', 'Pint (US)', '', 8),
  72. ('Gallon (US)', 'Quart (US)', '', 4), -- *
  73. ('Gallon (US)', 'mL', '', 4*32*236.5882365/8),
  74. ('Cup (metric)', 'kg', 'Whole Oats', 0.214/2), -- *
  75. ('Cup (metric)', 'kg', 'Puffed Rice', .03), -- *
  76. ('Cup (metric)', 'kg', 'Coconut Desiccated', .071*2), -- *
  77. -- ('Cup (metric)', 'kg', 'Peanut butter', .24),
  78. ('Cup (metric)', 'kg', 'Honey', .68), -- *
  79. ('kg', 'mL', 'Honey', 250/.68),
  80. ('Cup (metric)', 'kg', 'Brown Sugar', .055*4), -- *
  81. ('g', 'mL', 'Brown Sugar', 250/.055/4/1000),
  82. ('Cup (metric)', 'kg', 'Red Lentils', .199), -- *
  83. ('L', 'kg', 'Coconut Oil', .95), -- *
  84. ('Cup (metric)', 'g', 'Red Lentils', 199),
  85. ('mL', 'g', 'Coconut Oil', 950.0/1000),
  86. ('Cup (metric)', 'kg', 'Brown Rice', .19) -- *
  87. ) AS tests(f,t,p,e) LOOP
  88. BEGIN
  89. SELECT convert_unit(item.f, item.t, item.p) INTO result;
  90. SELECT item.e INTO expected;
  91. ASSERT result = expected, 'convert_unit('''||item.f||''', '''||item.t||''', '''||item.p||''') = '||result||' != '||expected;
  92. RAISE NOTICE ' convert_unit(''%'', ''%'', ''%'') = %', item.f, item.t, item.p, result;
  93. EXCEPTION
  94. WHEN assert_failure THEN
  95. BEGIN
  96. GET STACKED DIAGNOSTICS msg = MESSAGE_TEXT;
  97. RAISE WARNING '%', msg;
  98. END;
  99. END;
  100. END LOOP;
  101. END;
  102. $$ LANGUAGE plpgsql;
  103. ROLLBACK;