The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#! /usr/bin/perl

use strict;
use warnings;
use Test::More tests => 74;
BEGIN { use_ok('Geo::OSM::Tiles', qw(:all)) };

# Simple tests of well known values.
{
    # 2..4
    my $zoom = 13;
    my $lat = 49.60055;
    my $lon = 11.01296;
    my $tilex = lon2tilex($lon, $zoom);
    is($tilex, 4346, "tile x at lon = $lon, zoom = $zoom");
    my $tiley = lat2tiley($lat, $zoom);
    is($tiley, 2792, "tile y at lat = $lat, zoom = $zoom");
    my $path = tile2path($tilex, $tiley, $zoom);
    is($path, '13/4346/2792.png', "path");
}

# Simple consistency test for zooming:
# tile numbers must get halved when zooming out one level.
{
    # 5..38
    # At this position we get all possible combinations of even and
    # odd tile numbers throughout the different zoom levels.
    my $lat = -33.84122;
    my $lon = 108.00000;
    my $zoom = 18;
    my $tilex = lon2tilex($lon, $zoom);
    my $tiley = lat2tiley($lat, $zoom);
    while ($zoom > 1) {
	my $otx = $tilex;
	my $oty = $tiley;
	$zoom--;
	$tilex = lon2tilex($lon, $zoom);
	is($tilex, int($otx / 2), "tile x at lon = $lon, zoom = $zoom");
	$tiley = lat2tiley($lat, $zoom);
	is($tiley, int($oty / 2), "tile y at lat = $lat, zoom = $zoom");
    }
}

# Check the bound checking in checklonrange and checklatrange.
{
    # 39..74
    # A range of coordinates that is out of bounds for sure.
    my @hugerange = (-1000.0, 1000.0);
    for my $zoom (0, 1, 2, 5, 10, 15, 18, 20, 30) {
	# 4 tests per zoom level
	my $max = 2**$zoom-1;

	my ($lonmin, $lonmax) = checklonrange(@hugerange);
	my ($xmin, $xmax) = map { lon2tilex($_, $zoom) } ($lonmin, $lonmax);
	is($xmin, 0, "\$xmin at zoom = $zoom");
	is($xmax, $max, "\$xmax at zoom = $zoom");

	# Note that lat2tiley is decreasing,
	# so $ymin = lat2tiley($latmax, $zoom).
	my ($latmin, $latmax) = checklatrange(@hugerange);
	my ($ymax, $ymin) = map { lat2tiley($_, $zoom) } ($latmin, $latmax);
	is($ymin, 0, "\$ymin at zoom = $zoom");
	is($ymax, $max, "\$ymax at zoom = $zoom");
    }
}

# Local Variables:
# mode: perl
# End: