Module:Coordinates/testcases

Documentation for this module may be created at Module:Coordinates/testcases/doc

Code

-- Unit tests for [[Module:Coordinates]]. Click talk page to run tests.
local p = require('Module:UnitTests')

local invoke = mw.title.getCurrentTitle() or ''
if invoke.subpageText == 'testcases' then invoke = mw.title.new(tostring(invoke.baseText), 'Module') end
invoke = '{{#invoke:Coordinates' .. (invoke.subpageText == 'sandbox' and '/sandbox' or '') .. '|'

function p:test_1_getHeading()
    self:preprocess_equals(invoke..'getHeading |heading:NE}}', '45')
    self:preprocess_equals(invoke..'getHeading |heading:NWbW}}', '303.75')
    self:preprocess_equals(invoke..'getHeading |heading:100}}', '100')
    self:preprocess_equals(invoke..'getHeading |heading:-400}}', '320')
    self:preprocess_equals(invoke..'getHeading |heading:100_elevation:1000}}', '100')
    self:preprocess_equals(invoke..'getHeading |elevation:1000_heading:100}}', '100')
    self:preprocess_equals(invoke..'getHeading |elevation:1000_heading:33.33}}', '33.33')
    self:preprocess_equals(invoke..'getHeading |heading:john}}', '')
    self:preprocess_equals(invoke..'getHeading |elevation:1000}}', '')
end

function p:test_2_parseAttribute()
    self:preprocess_equals(invoke..'parseAttribute |heading:100_elevation:1000|heading}}', '100')
    self:preprocess_equals(invoke..'parseAttribute |heading:100_elevation:1000|elevation}}', '1000')
end

function p:test_3_deg2dms()
-- With up to 4 decimals of fractional degrees, the conversion matches up to 2 decimals of fractional seconds to DMS.
-- But this allows only metric precision on the equator.
    self:preprocess_equals(invoke..'deg2dms|199.9900000|lang=en}}', '199° 59′ 24″')
    self:preprocess_equals(invoke..'deg2dms|199.9990000|lang=en}}', '199° 59′ 56.4″')
    self:preprocess_equals(invoke..'deg2dms|199.9999000|lang=en}}', '199° 59′ 59.64″')

-- Reduced precision (only metric for global positioning on the equator): this NO LONGER matches
-- exactly the effective 64-bit double-precision data precision of coordinates used in OSM data.
    self:preprocess_equals(invoke..'deg2dms|199.9999900|lang=en}}', '199° 59′ 59.96″')
    self:preprocess_equals(invoke..'deg2dms|199.9999950|lang=en}}', '199° 59′ 59.98″')
    self:preprocess_equals(invoke..'deg2dms|200.0000000|lang=en}}', '200° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|200.0000014|lang=en}}', '200° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|200.0000015|lang=en}}', '200° 00′ 00.01″')
    self:preprocess_equals(invoke..'deg2dms|200.0000041|lang=en}}', '200° 00′ 00.01″')
    self:preprocess_equals(invoke..'deg2dms|200.0000042|lang=en}}', '200° 00′ 00.02″')
    self:preprocess_equals(invoke..'deg2dms|200.0000069|lang=en}}', '200° 00′ 00.02″')
    self:preprocess_equals(invoke..'deg2dms|200.0000070|lang=en}}', '200° 00′ 00.03″')
    self:preprocess_equals(invoke..'deg2dms|200.0000097|lang=en}}', '200° 00′ 00.03″')
    self:preprocess_equals(invoke..'deg2dms|200.0000098|lang=en}}', '200° 00′ 00.04″')
    self:preprocess_equals(invoke..'deg2dms|200.0000125|lang=en}}', '200° 00′ 00.04″')
    self:preprocess_equals(invoke..'deg2dms|200.0000126|lang=en}}', '200° 00′ 00.05″')

-- Better (decimetric) precision was previously supported (with 1 additional significant digit), but it was unfortunately
-- reverted without understanding and effective tests: this reversal by User:Jareckt generates once again discrepancies
-- between coordinates in OSM and Wikidata, then frequent readjustments trying to match them, but without success.
--[[
    self:preprocess_equals(invoke..'deg2dms|199.9999900|lang=en}}', '199° 59′ 59.964″')
    self:preprocess_equals(invoke..'deg2dms|199.9999950|lang=en}}', '199° 59′ 59.982″')
    self:preprocess_equals(invoke..'deg2dms|199.9999990|lang=en}}', '199° 59′ 59.996″')
    self:preprocess_equals(invoke..'deg2dms|199.9999995|lang=en}}', '199° 59′ 59.998″')
    self:preprocess_equals(invoke..'deg2dms|199.9999997|lang=en}}', '199° 59′ 59.999″')
    self:preprocess_equals(invoke..'deg2dms|199.9999998|lang=en}}', '199° 59′ 59.999″')
    self:preprocess_equals(invoke..'deg2dms|199.9999999|lang=en}}', '200° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|200.0000000|lang=en}}', '200° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|200.0000001|lang=en}}', '200° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|200.0000002|lang=en}}', '200° 00′ 00.001″')
    self:preprocess_equals(invoke..'deg2dms|200.0000003|lang=en}}', '200° 00′ 00.001″')
    self:preprocess_equals(invoke..'deg2dms|200.0000004|lang=en}}', '200° 00′ 00.001″')
    self:preprocess_equals(invoke..'deg2dms|200.0000005|lang=en}}', '200° 00′ 00.002″')
    self:preprocess_equals(invoke..'deg2dms|200.0000100|lang=en}}', '200° 00′ 00.036″')
--]]

    self:preprocess_equals(invoke..'deg2dms|-90|lang=en}}', '270° 00′ 00″')
    self:preprocess_equals(invoke..'deg2dms|180.5|lang=en}}' , '180° 30′ 00″')
    self:preprocess_equals(invoke..'deg2dms|{{#expr:123+45/60+12.34/3600}}|lang=en}}' , '123° 45′ 12.34″')
    self:preprocess_equals(invoke..'deg2dms|{{#expr:123+45/60+12.34/3600}}|lang=pl}}' , '123° 45′ 12,34″')
    self:preprocess_equals(invoke..'deg2dms|48.8566667|lang=fr}}' , '48° 51′ 24″')
    self:preprocess_equals(invoke..'deg2dms|48.8566667|lang=fa}}' , '۴۸° ۵۱′ ۲۴″')
    self:preprocess_equals(invoke..'deg2dms|40°|lang=en}}' , '40°')
end

function p:test_4_lat_lon()
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=en }}','51° 28′ 48″ N, 0° 00′ 00″ E')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=ru }}','51° 28′ 48″ с. ш., 0° 00′ 00″ в. д.')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=ab }}','51° 28′ 48″ с. ш., 0° 00′ 00″ в. д.')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=th }}','51° 28′ 48″ เหนือ, 0° 00′ 00″ ตะวันออก')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=ml }}','51° 28′ 48″ വ, 0° 00′ 00″ കി')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=xx }}','51° 28′ 48″ N, 0° 00′ 00″ E')
	self:preprocess_equals(invoke..'lat_lon |lat=51.48 |lon=0 |lang=be-tarask }}','51° 28′ 48″ пн. ш., 0° 00′ 00″ з. д.')
	self:preprocess_equals(invoke..'lat_lon |lat= |lon= |lang=en }}','latitude, longitude')
end

function p:test_5_externalLink()
    local pagename = mw.uri.encode(mw.title.getCurrentTitle().prefixedText, 'WIKI')
    self:preprocess_equals(invoke..'externalLink |site=GoogleMaps |globe=Earth |lat=51.48 |lon=0 |lang=en }}',
        'https://wp-world.toolforge.org/googlmaps-proxy.php?page=' .. mw.uri.encode('http://kmlexport.toolforge.org/?project=Commons&article=' .. pagename, 'WIKI') .. '&l=1&output=classic',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GoogleMaps |globe=Earth |lat=51.48 |lon=0 |lang=pl }}',
        'https://wp-world.toolforge.org/googlmaps-proxy.php?page=' .. mw.uri.encode('http://kmlexport.toolforge.org/?project=Commons&article=' .. pagename, 'WIKI') .. '&l=1&output=classic',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=Proximityrama |globe=Earth |lat=51.48 |lon=0 |lang=en }}',
        'https://tools.wmflabs.org/geocommons/proximityrama?latlon=51.48,0',
        {nowiki=1, varying=1}) -- unsupported, no failure
    self:preprocess_equals(invoke..'externalLink |site=OpenStreetMap1 |globe=Earth |lat=51.48 |lon=0 |lang=en }}',
        'https://wikimap.toolforge.org/?wp=false&cluster=false&zoom=16&lat=51.48&lon=0',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GeoHack |globe=Earth |lat=51.48 |lon=0 |lang=en |attributes=heading:190 }}',
        'https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=51.48_N_0_E_globe:Earth_heading:190&language=en',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GoogleMaps |globe=Moon |lat=0.655930 |lon=23.470173 }}',
        'https://www.google.com/moon/#lat=0.655930&lon=23.470173&zoom=8',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GoogleMaps |globe=Mars |lat=-14.6 |lon=175.5 }}',
        'https://www.google.com/mars/#lat=-14.6&lon=175.5&zoom=8',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GeoHack |globe=Moon |lat=0.655930 |lon=23.470173 |attributes= |lang=en }}',
        'https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=0.655930_N_23.470173_E_globe:Moon_&language=en',
        {nowiki=1})
    self:preprocess_equals(invoke..'externalLink |site=GeoHack |globe=Mars |lat=-14.6 |lon=175.5 |attributes= |lang=en }}',
        'https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=-14.6_N_175.5_E_globe:Mars_&language=en',
        {nowiki=1})
end

function p:test_6_GeoHack_link()
    local pagename = mw.uri.encode(mw.title.getCurrentTitle().prefixedText, 'WIKI')
	self:preprocess_equals(invoke..'GeoHack_link |lat=51.48 |lon=0 }}',
        '<span class="plainlinksneverexpand">[https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=51.48_N_0_E_globe:Earth_&language=en 51°&nbsp;28′&nbsp;48″&nbsp;N, 0°&nbsp;00′&nbsp;00″&nbsp;E]</span>',
        {nowiki=1})
	self:preprocess_equals(invoke..'GeoHack_link |lat=51.48 |lon=0 |lang=fr }}',
        '<span class="plainlinksneverexpand">[https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=51.48_N_0_E_globe:Earth_&language=fr 51°&nbsp;28′&nbsp;48″&nbsp;N, 0°&nbsp;00′&nbsp;00″&nbsp;E]</span>',
        {nowiki=1})
	self:preprocess_equals(invoke..'GeoHack_link |lat=51.48 |lon=0 |lang=ru }}',
        '<span class="plainlinksneverexpand">[https://geohack.toolforge.org/geohack.php?pagename=' .. pagename .. '&params=51.48_N_0_E_globe:Earth_&language=ru 51°&nbsp;28′&nbsp;48″&nbsp;с.&nbsp;ш., 0°&nbsp;00′&nbsp;00″&nbsp;в.&nbsp;д.]</span>',
        {nowiki=1})
	self:preprocess_equals(invoke..'GeoHack_link |lat= |lon=0 |lang=ru }}',
        'latitude, longitude')
end

return p