From db131264090b7c41c53ca993c553437808695fe5 Mon Sep 17 00:00:00 2001 From: Parth Mehta Date: Sun, 4 Jun 2017 00:35:10 +1000 Subject: [PATCH] Conversions Suggestion: (ANGLE) - Add Missing Units (#4224) * added custom units for angle conversions * added triggers for angle custom units * added front-end tests for custom angle units * Refactoring. Categorized queries by the quantity they represent * minor update * added trigger for the word - microarcseconds * replaced exponent-based values with decimal-based ones * Updated tests to use defined units * added the missing commas * removed duplicate e+12 from test spec --- share/goodie/conversions/conversions.js | 36 +- share/goodie/conversions/triggers.yml | 40 +++ spec/conversions_spec.js | 50 ++- t/Conversions.t | 453 +++++++++++++----------- 4 files changed, 352 insertions(+), 227 deletions(-) diff --git a/share/goodie/conversions/conversions.js b/share/goodie/conversions/conversions.js index afe262376..1f8a24aaf 100644 --- a/share/goodie/conversions/conversions.js +++ b/share/goodie/conversions/conversions.js @@ -52,6 +52,12 @@ DDH.conversions = DDH.conversions || {}; {name: 'sqcentimeter', factor: '0.0001 m2'}, {name: 'sqmillimeter', factor: '100 sqcentimeter'}, + // CUSTOM DURATION UNITS + {name: "femtosecond", factor: "0.000000000000001 second"}, + {name: "picosecond", factor: "0.000000000001 second"}, + {name: "fortnight", factor: "2 week"}, + {name: "siderealyear", factor: "1.00001741 year"}, + // CUSTOM DIGITAL UNITS {name: 'kbit', factor: '1000 b'}, {name: 'mbit', factor: '1000000 b'}, @@ -62,12 +68,12 @@ DDH.conversions = DDH.conversions || {}; {name: 'GB', factor: '1000000000 B'}, {name: 'TB', factor: '1000 GB'}, {name: 'PB', factor: '1000 TB'}, - - // CUSTOM DURATION UNITS - {name: "femtosecond", factor: "0.000000000000001 second"}, - {name: "picosecond", factor: "0.000000000001 second"}, - {name: "fortnight", factor: "2 week"}, - {name: "siderealyear", factor: "1.00001741 year"}, + + // CUSTOM ANGLE UNITS + {name: 'microarcsec', factor: '0.000000000004848 rad'}, + {name: 'milliarcsec', factor: '0.000000004848 rad'}, + {name: 'microrad', factor: '0.000001 rad'}, + {name: 'rev', factor: '6.2832 rad'}, // CUSTOM ENERGY UNITS {name: 'kilojoule', factor: '1000 joules'}, @@ -243,13 +249,17 @@ DDH.conversions = DDH.conversions || {}; angle: { name: "Angle", units: [ - { symbol: 'rad', name: 'Radians' }, - { symbol: 'deg', name: 'Degrees' }, - { symbol: 'grad', name: 'Gradians' }, - { symbol: 'cycle', name: 'Cycles' }, - { symbol: 'arcsec', name: 'Arcsecond' }, - { symbol: 'arcmin', name: 'Arcminute' }, - { symbol: 'millirad', name: 'Milliradian' }, + { symbol: 'rad', name: 'Radians' }, + { symbol: 'deg', name: 'Degrees' }, + { symbol: 'grad', name: 'Gradians' }, + { symbol: 'cycle', name: 'Cycles' }, + { symbol: 'arcsec', name: 'Arcsecond' }, + { symbol: 'arcmin', name: 'Arcminute' }, + { symbol: 'millirad', name: 'Milliradian' }, + { symbol: 'microrad', name: 'Microradian' }, + { symbol: 'milliarcsec', name: 'Milliarcsecond' }, + { symbol: 'microarcsec', name: 'Microarcsecond' }, + { symbol: 'rev', name: 'Revolution' } ], defaults: ['deg', 'rad'] }, diff --git a/share/goodie/conversions/triggers.yml b/share/goodie/conversions/triggers.yml index f3a6abd5b..e782a115d 100755 --- a/share/goodie/conversions/triggers.yml +++ b/share/goodie/conversions/triggers.yml @@ -1291,6 +1291,46 @@ aliases: type: angle unit: grad --- +aliases: + - microradian + - microradians + - micro-radian + - micro-radians + - microrad + - microrads +type: angle +unit: microrad +--- +aliases: + - microarcsec + - microarcsecs + - microarcsecond + - microarcseconds + - micro-arcsec + - micro-arcsecs + - micro-arcsecond + - micro-arcseconds +type: angle +unit: microarcsec +--- +aliases: + - milliarcsec + - milliarcsecond + - milli-arcsec + - milli-arcsecond + - milliarcsecs + - milli-arcsecs +type: angle +unit: milliarcsec +--- +aliases: + - revolution + - revolutions + - rev + - revs +type: angle +unit: rev +--- aliases: - newton - newtons diff --git a/spec/conversions_spec.js b/spec/conversions_spec.js index 1334c0055..a35d8db34 100644 --- a/spec/conversions_spec.js +++ b/spec/conversions_spec.js @@ -127,9 +127,9 @@ describe("Conversion of Custom Units", function() { expect(conversion).toEqual("2.00003482"); }); - /** - * CUSTOM PRESSURE UNITS - */ + /** + * CUSTOM PRESSURE UNITS + */ it("should convert barye to Satm", function() { var conversion = stripUnit(math.eval("10132.5barye to Satm")); expect(conversion).toEqual("0.009999999999999998"); @@ -178,6 +178,49 @@ describe("Conversion of Custom Units", function() { expect(conversion).toEqual("27375.912"); }); + /** + * CUSTOM ANGLE UNITS + */ + it("should convert radians to microarcseconds", function() { + var conversion = stripUnit(math.eval("5rad to microarcsec")); + expect(conversion).toEqual("1.0313531353135312e+12"); + }); + + it("should convert microarcseconds to radians", function() { + var conversion = stripUnit(math.eval("8microarcsec to rad")); + expect(conversion).toEqual("3.8784e-11"); + }); + + it("should convert radians to milliarcseconds", function() { + var conversion = stripUnit(math.eval("12rad to milliarcsec")); + expect(conversion).toEqual("2.4752475247524753e+9"); + }); + + it("should convert milliarcseconds to radians", function() { + var conversion = stripUnit(math.eval("9milliarcsec to rad")); + expect(conversion).toEqual("4.3631999999999997e-8"); + }); + + it("should convert radians to microradians", function() { + var conversion = stripUnit(math.eval("4rad to microrad")); + expect(conversion).toEqual("4e+6"); + }); + + it("should convert microradians to radians", function() { + var conversion = stripUnit(math.eval("26microrad to rad")); + expect(conversion).toEqual("2.6e-5"); + }); + + it("should convert radians to revolutions", function() { + var conversion = stripUnit(math.eval("16rad to rev")); + expect(conversion).toEqual("2.546473134708429"); + }); + + it("should convert revolutions to radians", function() { + var conversion = stripUnit(math.eval("7rev to rad")); + expect(conversion).toEqual("43.9824"); + }); + /** * CUSTOM MASS UNITS */ @@ -354,5 +397,4 @@ describe("Conversion of Custom Units", function() { var conversion = stripUnit(math.eval("5zettaelectronvolt to yottaelectronvolt")); expect(conversion).toEqual("0.005"); }); - }); \ No newline at end of file diff --git a/t/Conversions.t b/t/Conversions.t index 6d9bf55fb..f8010547a 100755 --- a/t/Conversions.t +++ b/t/Conversions.t @@ -58,6 +58,7 @@ sub make_answer_with_base(%){ ddg_goodie_test( ['DDG::Goodie::Conversions'], + # Example queries 'convert 5 oz to grams' => test_zci( '', @@ -84,7 +85,9 @@ ddg_goodie_test( physical_quantity => 'mass' }) ), + # Explicit conversion requests + # MASS 'convert 158 ounce to lbm' => test_zci( '', structured_answer => make_answer({ raw_input => '158', @@ -93,6 +96,23 @@ ddg_goodie_test( physical_quantity => 'mass' }) ), + 'convert 0.111 stone to pound' => test_zci( + '', structured_answer => make_answer({ + raw_input => '0.111', + from_unit => 'stone', + to_unit => 'poundmass', + physical_quantity => 'mass' + }) + ), + 'convert 1stone to lbs' => test_zci( + '', structured_answer => make_answer({ + raw_input => '1', + from_unit => 'stone', + to_unit => 'poundmass', + physical_quantity => 'mass' + }) + ), + # LENGTH q`5' 7" in inches` => test_zci( '', structured_answer => make_answer({ raw_input => '5.5833333333333333333333333333333333333333', @@ -133,14 +153,6 @@ ddg_goodie_test( physical_quantity => 'length' }) ), - 'convert 0.111 stone to pound' => test_zci( - '', structured_answer => make_answer({ - raw_input => '0.111', - from_unit => 'stone', - to_unit => 'poundmass', - physical_quantity => 'mass' - }) - ), 'convert 5 feet to in' => test_zci( '', structured_answer => make_answer({ raw_input => '5', @@ -157,14 +169,6 @@ ddg_goodie_test( physical_quantity => 'length' }) ), - 'convert 5 kelvin to fahrenheit' => test_zci( - '', structured_answer => make_answer({ - raw_input => '5', - from_unit => 'kelvin', - to_unit => 'fahrenheit', - physical_quantity => 'temperature' - }) - ), 'convert 25 inches into feet' => test_zci( '', structured_answer => make_answer({ raw_input => '25', @@ -173,6 +177,23 @@ ddg_goodie_test( physical_quantity => 'length' }) ), + 'convert km to cm' => test_zci( + '', structured_answer => make_answer({ + raw_input => '1', + from_unit => 'kilometer', + to_unit => 'cm', + physical_quantity => 'length' + }) + ), + # TEMPERATURE + 'convert 5 kelvin to fahrenheit' => test_zci( + '', structured_answer => make_answer({ + raw_input => '5', + from_unit => 'kelvin', + to_unit => 'fahrenheit', + physical_quantity => 'temperature' + }) + ), 'convert 5 f to celsius' => test_zci( '', structured_answer => make_answer({ raw_input => '5', @@ -205,23 +226,9 @@ ddg_goodie_test( physical_quantity => 'temperature' }) ), - 'convert km to cm' => test_zci( - '', structured_answer => make_answer({ - raw_input => '1', - from_unit => 'kilometer', - to_unit => 'cm', - physical_quantity => 'length' - }) - ), - 'convert 1stone to lbs' => test_zci( - '', structured_answer => make_answer({ - raw_input => '1', - from_unit => 'stone', - to_unit => 'poundmass', - physical_quantity => 'mass' - }) - ), + # Implicit conversion requests + # MASS '3 kilogramme to pound' => test_zci( '', structured_answer => make_answer({ raw_input => '3', @@ -246,14 +253,15 @@ ddg_goodie_test( physical_quantity => 'mass' }) ), - '0.01933677566613741911668448550544 psi in mmHg' => test_zci( + '7 milligrams to micrograms' => test_zci( '', structured_answer => make_answer({ - raw_input => '0.01933677566613741911668448550544', - from_unit => 'psi', - to_unit => 'mmHg', - physical_quantity => 'pressure' + raw_input => '7', + from_unit => 'milligram', + to_unit => 'microgram', + physical_quantity => 'mass' }) ), + # LENGTH '2 miles to km' => test_zci( '', structured_answer => make_answer({ raw_input => '2', @@ -318,169 +326,6 @@ ddg_goodie_test( physical_quantity => 'length' }) ), - '36 months to years' => test_zci( - '', structured_answer => make_answer({ - raw_input => '36', - from_unit => 'month', - to_unit => 'year', - physical_quantity => 'duration' - }) - ), - '43200 seconds in hours' => test_zci( - '', structured_answer => make_answer({ - raw_input => '43200', - from_unit => 'second', - to_unit => 'hour', - physical_quantity => 'duration' - }) - ), - '4 hours to minutes' => test_zci( - '', - structured_answer => make_answer({ - raw_input => '4', - from_unit => 'hour', - to_unit => 'minute', - physical_quantity => 'duration' - }) - ), - '5yrds to km' => test_zci( - '', structured_answer => make_answer({ - raw_input => '5', - from_unit => 'yard', - to_unit => 'kilometer', - physical_quantity => 'length' - }) - ), - '12" to cm' => test_zci( - '', structured_answer => make_answer({ - raw_input => '12', - from_unit => 'inch', - to_unit => 'cm', - physical_quantity => 'length' - }) - ), - '180 degrees in radians' => test_zci( - '', structured_answer => make_answer({ - raw_input => '180', - from_unit => 'deg', - to_unit => 'rad', - physical_quantity => 'angle' - }) - ), - '180 degrees in grads' => test_zci( - '', - structured_answer => make_answer({ - raw_input => '180', - from_unit => 'deg', - to_unit => 'grad', - physical_quantity => 'angle' - }) - ), - '45 newtons to pounds force' => test_zci( - '', structured_answer => make_answer({ - raw_input => '45', - from_unit => 'newton', - to_unit => 'poundforce', - physical_quantity => 'force' - }) - ), - '10000 minutes in microseconds' => test_zci( - '', structured_answer => make_answer({ - raw_input => '10000', - from_unit => 'minute', - to_unit => 'microsecond', - physical_quantity => 'duration' - }) - ), - '3 decades in years' => test_zci( - '', structured_answer => make_answer({ - raw_input => '3', - from_unit => 'decade', - to_unit => 'year', - physical_quantity => 'duration' - }) - ), - '2 centuries in years' => test_zci( - '', structured_answer => make_answer({ - raw_input => '2', - from_unit => 'century', - to_unit => 'year', - physical_quantity => 'duration' - }) - ), - '2 millennia in years' => test_zci( - '', structured_answer => make_answer({ - raw_input => '2', - from_unit => 'millennium', - to_unit => 'year', - physical_quantity => 'duration' - }) - ), - '16 years in months' => test_zci( - '', structured_answer => make_answer({ - raw_input => '16', - from_unit => 'year', - to_unit => 'month', - physical_quantity => 'duration' - }) - ), - '1 year in months' => test_zci( - '', structured_answer => make_answer({ - raw_input => '1', - from_unit => 'year', - to_unit => 'month', - physical_quantity => 'duration' - }) - ), - '1 degree fahrenheit to celsius' => test_zci( - '', - structured_answer => make_answer({ - raw_input => '1', - from_unit => 'fahrenheit', - to_unit => 'celsius', - physical_quantity => 'temperature' - }) - ), - '12 degrees Celsius to Fahrenheit' => test_zci( - '', structured_answer => make_answer({ - raw_input => '12', - from_unit => 'celsius', - to_unit => 'fahrenheit', - physical_quantity => 'temperature' - }) - ), - '1 degrees Fahrenheit to celsius' => test_zci( - '', structured_answer => make_answer({ - raw_input => '1', - from_unit => 'fahrenheit', - to_unit => 'celsius', - physical_quantity => 'temperature' - }) - ), - '0 c in kelvin' => test_zci( - '', structured_answer => make_answer({ - raw_input => '0', - from_unit => 'celsius', - to_unit => 'kelvin', - physical_quantity => 'temperature' - }) - ), - '234 f to c' => test_zci( - '', structured_answer => make_answer({ - raw_input => '234', - from_unit => 'fahrenheit', - to_unit => 'celsius', - physical_quantity => 'temperature' - }) - ), - '234 f to kelvin' => test_zci( - '', structured_answer => make_answer({ - raw_input => '234', - from_unit => 'fahrenheit', - to_unit => 'kelvin', - physical_quantity => 'temperature' - }) - ), 'metres from 20 yards' => test_zci( '', structured_answer => make_answer({ raw_input => '20', @@ -489,14 +334,6 @@ ddg_goodie_test( physical_quantity => 'length' }) ), - '7 milligrams to micrograms' => test_zci( - '', structured_answer => make_answer({ - raw_input => '7', - from_unit => 'milligram', - to_unit => 'microgram', - physical_quantity => 'mass' - }) - ), 'inches in 5 meters' => test_zci( '', structured_answer => make_answer({ raw_input => '5', @@ -561,7 +398,183 @@ ddg_goodie_test( physical_quantity => 'length' }) ), - # Areas and volumes + '5yrds to km' => test_zci( + '', structured_answer => make_answer({ + raw_input => '5', + from_unit => 'yard', + to_unit => 'kilometer', + physical_quantity => 'length' + }) + ), + '12" to cm' => test_zci( + '', structured_answer => make_answer({ + raw_input => '12', + from_unit => 'inch', + to_unit => 'cm', + physical_quantity => 'length' + }) + ), + # TEMPERATURE + '1 degree fahrenheit to celsius' => test_zci( + '', + structured_answer => make_answer({ + raw_input => '1', + from_unit => 'fahrenheit', + to_unit => 'celsius', + physical_quantity => 'temperature' + }) + ), + '12 degrees Celsius to Fahrenheit' => test_zci( + '', structured_answer => make_answer({ + raw_input => '12', + from_unit => 'celsius', + to_unit => 'fahrenheit', + physical_quantity => 'temperature' + }) + ), + '1 degrees Fahrenheit to celsius' => test_zci( + '', structured_answer => make_answer({ + raw_input => '1', + from_unit => 'fahrenheit', + to_unit => 'celsius', + physical_quantity => 'temperature' + }) + ), + '0 c in kelvin' => test_zci( + '', structured_answer => make_answer({ + raw_input => '0', + from_unit => 'celsius', + to_unit => 'kelvin', + physical_quantity => 'temperature' + }) + ), + '234 f to c' => test_zci( + '', structured_answer => make_answer({ + raw_input => '234', + from_unit => 'fahrenheit', + to_unit => 'celsius', + physical_quantity => 'temperature' + }) + ), + '234 f to kelvin' => test_zci( + '', structured_answer => make_answer({ + raw_input => '234', + from_unit => 'fahrenheit', + to_unit => 'kelvin', + physical_quantity => 'temperature' + }) + ), + # FORCE + '45 newtons to pounds force' => test_zci( + '', structured_answer => make_answer({ + raw_input => '45', + from_unit => 'newton', + to_unit => 'poundforce', + physical_quantity => 'force' + }) + ), + # PRESSURE + '0.01933677566613741911668448550544 psi in mmHg' => test_zci( + '', structured_answer => make_answer({ + raw_input => '0.01933677566613741911668448550544', + from_unit => 'psi', + to_unit => 'mmHg', + physical_quantity => 'pressure' + }) + ), + # DURATION + '36 months to years' => test_zci( + '', structured_answer => make_answer({ + raw_input => '36', + from_unit => 'month', + to_unit => 'year', + physical_quantity => 'duration' + }) + ), + '43200 seconds in hours' => test_zci( + '', structured_answer => make_answer({ + raw_input => '43200', + from_unit => 'second', + to_unit => 'hour', + physical_quantity => 'duration' + }) + ), + '4 hours to minutes' => test_zci( + '', + structured_answer => make_answer({ + raw_input => '4', + from_unit => 'hour', + to_unit => 'minute', + physical_quantity => 'duration' + }) + ), + '10000 minutes in microseconds' => test_zci( + '', structured_answer => make_answer({ + raw_input => '10000', + from_unit => 'minute', + to_unit => 'microsecond', + physical_quantity => 'duration' + }) + ), + '3 decades in years' => test_zci( + '', structured_answer => make_answer({ + raw_input => '3', + from_unit => 'decade', + to_unit => 'year', + physical_quantity => 'duration' + }) + ), + '2 centuries in years' => test_zci( + '', structured_answer => make_answer({ + raw_input => '2', + from_unit => 'century', + to_unit => 'year', + physical_quantity => 'duration' + }) + ), + '2 millennia in years' => test_zci( + '', structured_answer => make_answer({ + raw_input => '2', + from_unit => 'millennium', + to_unit => 'year', + physical_quantity => 'duration' + }) + ), + '16 years in months' => test_zci( + '', structured_answer => make_answer({ + raw_input => '16', + from_unit => 'year', + to_unit => 'month', + physical_quantity => 'duration' + }) + ), + '1 year in months' => test_zci( + '', structured_answer => make_answer({ + raw_input => '1', + from_unit => 'year', + to_unit => 'month', + physical_quantity => 'duration' + }) + ), + # ANGLE + '180 degrees in radians' => test_zci( + '', structured_answer => make_answer({ + raw_input => '180', + from_unit => 'deg', + to_unit => 'rad', + physical_quantity => 'angle' + }) + ), + '180 degrees in grads' => test_zci( + '', + structured_answer => make_answer({ + raw_input => '180', + from_unit => 'deg', + to_unit => 'grad', + physical_quantity => 'angle' + }) + ), + # AREAS & VOLUME '0.001 litres in millilitres' => test_zci( '', structured_answer => make_answer({ raw_input => '0.001', @@ -1326,6 +1339,7 @@ ddg_goodie_test( physical_quantity => 'temperature' }) ), + #Question format: 'How to convert meters to inches' => test_zci( '', structured_answer => make_answer({ @@ -1343,6 +1357,7 @@ ddg_goodie_test( physical_quantity => 'length' }) ), + # Representation (scientific notation) '30000 km to m' => test_zci( '', structured_answer => make_answer({ @@ -1409,6 +1424,7 @@ ddg_goodie_test( physical_quantity => 'mass' }) ), + # Flexible queries '190 lb = ?kg' => test_zci( '', structured_answer => make_answer({ @@ -1482,6 +1498,22 @@ ddg_goodie_test( physical_quantity => 'area' }) ), + + # NATURAL LANGUAGE QUERIES + 'unit converter' => test_zci( + '', + structured_answer => make_answer_lang() + ), + 'unit conversion' => test_zci( + '', + structured_answer => make_answer_lang() + ), + 'online converter' => test_zci( + '', + structured_answer => make_answer_lang() + ), + + # INTENTIONALLY UNTRIGGERED '155 liters to millilitres' => test_zci( '', structured_answer => make_answer({ raw_input => '155', @@ -1843,6 +1875,7 @@ ddg_goodie_test( }) ), # Intentionally untriggered + 'BTU to KwH' => undef, '5 inches in 5 meters' => undef, 'convert 1 cm to 2 mm' => undef, @@ -1865,4 +1898,4 @@ ddg_goodie_test( '1E300 miles in metres' => undef, '5 pas.i to atm' => undef, ); -done_testing; +done_testing; \ No newline at end of file