qibla-dart/test/qibla_test.dart
2026-03-08 12:58:43 -04:00

225 lines
7.3 KiB
Dart

import 'package:qibla/qibla.dart';
import 'package:test/test.dart';
void main() {
group('KAABA constants', () {
test('latitude is approximately 21.42 N', () {
expect((kaabaLat - 21.42).abs(), lessThan(0.1));
});
test('longitude is approximately 39.83 E', () {
expect((kaabaLng - 39.83).abs(), lessThan(0.1));
});
test('earthRadiusKm is 6371', () {
expect(earthRadiusKm, equals(6371));
});
});
group('qiblaAngle', () {
test('returns a number between 0 and 360', () {
final angle = qiblaAngle(40.7128, -74.006);
expect(angle, greaterThanOrEqualTo(0));
expect(angle, lessThan(360));
});
test('New York City (~58 NE)', () {
final angle = qiblaAngle(40.7128, -74.006);
expect(angle, greaterThan(50));
expect(angle, lessThan(70));
});
test('London (~119 SE)', () {
final angle = qiblaAngle(51.5074, -0.1278);
expect(angle, greaterThan(110));
expect(angle, lessThan(130));
});
test('Tokyo (~293 NW)', () {
final angle = qiblaAngle(35.6762, 139.6503);
expect(angle, greaterThan(280));
expect(angle, lessThan(310));
});
test('Sydney (~277 W)', () {
final angle = qiblaAngle(-33.8688, 151.2093);
expect(angle, greaterThan(260));
expect(angle, lessThan(300));
});
test('Islamabad (~268 W)', () {
final angle = qiblaAngle(33.6844, 73.0479);
expect(angle, greaterThan(250));
expect(angle, lessThan(290));
});
test('returns finite number at Ka\'bah (degenerate case)', () {
final angle = qiblaAngle(kaabaLat, kaabaLng);
expect(angle.isFinite, isTrue);
});
test('equator east of Mecca points NW', () {
final angle = qiblaAngle(0, 80);
expect(angle, greaterThan(270));
expect(angle, lessThan(360));
});
test('result is stable (same input gives same output)', () {
final a = qiblaAngle(40.7128, -74.006);
final b = qiblaAngle(40.7128, -74.006);
expect(a, equals(b));
});
test('throws RangeError for invalid latitude', () {
expect(() => qiblaAngle(91, 0), throwsRangeError);
expect(() => qiblaAngle(-91, 0), throwsRangeError);
});
test('throws RangeError for invalid longitude', () {
expect(() => qiblaAngle(0, 181), throwsRangeError);
expect(() => qiblaAngle(0, -181), throwsRangeError);
});
});
group('compassDir', () {
test('returns N for 0', () => expect(compassDir(0), equals('N')));
test('returns N for 360', () => expect(compassDir(360), equals('N')));
test('returns NE for 45', () => expect(compassDir(45), equals('NE')));
test('returns E for 90', () => expect(compassDir(90), equals('E')));
test('returns SE for 135', () => expect(compassDir(135), equals('SE')));
test('returns S for 180', () => expect(compassDir(180), equals('S')));
test('returns SW for 225', () => expect(compassDir(225), equals('SW')));
test('returns W for 270', () => expect(compassDir(270), equals('W')));
test('returns NW for 315', () => expect(compassDir(315), equals('NW')));
test('returns NE for NYC Qibla', () {
final bearing = qiblaAngle(40.7128, -74.006);
expect(compassDir(bearing), equals('NE'));
});
});
group('compassName', () {
test('returns North for 0', () {
expect(compassName(0), equals('North'));
});
test('returns Northeast for 45', () {
expect(compassName(45), equals('Northeast'));
});
test('returns East for 90', () {
expect(compassName(90), equals('East'));
});
test('returns Southeast for 135', () {
expect(compassName(135), equals('Southeast'));
});
test('returns South for 180', () {
expect(compassName(180), equals('South'));
});
test('returns Southwest for 225', () {
expect(compassName(225), equals('Southwest'));
});
test('returns West for 270', () {
expect(compassName(270), equals('West'));
});
test('returns Northwest for 315', () {
expect(compassName(315), equals('Northwest'));
});
test('returns North for 360', () {
expect(compassName(360), equals('North'));
});
});
group('qiblaGreatCircle', () {
test('returns a list of [lat, lng] pairs', () {
final points = qiblaGreatCircle(40.7128, -74.006);
expect(points, isNotEmpty);
expect(points[0].length, equals(2));
});
test('returns 121 points by default', () {
final points = qiblaGreatCircle(40.7128, -74.006);
expect(points.length, equals(121));
});
test('respects custom steps parameter', () {
final points = qiblaGreatCircle(40.7128, -74.006, 60);
expect(points.length, equals(61));
});
test('first point is close to origin', () {
final point = qiblaGreatCircle(40.7128, -74.006)[0];
expect((point[0] - 40.7128).abs(), lessThan(0.01));
expect((point[1] - -74.006).abs(), lessThan(0.01));
});
test('last point is close to Ka\'bah', () {
final points = qiblaGreatCircle(40.7128, -74.006);
final last = points[points.length - 1];
expect((last[0] - kaabaLat).abs(), lessThan(0.01));
expect((last[1] - kaabaLng).abs(), lessThan(0.01));
});
test('all points have valid coordinates', () {
final points = qiblaGreatCircle(51.5074, -0.1278, 10);
for (final point in points) {
expect(point[0].isFinite, isTrue);
expect(point[1].isFinite, isTrue);
expect(point[0], greaterThanOrEqualTo(-90));
expect(point[0], lessThanOrEqualTo(90));
expect(point[1], greaterThanOrEqualTo(-180));
expect(point[1], lessThanOrEqualTo(180));
}
});
test('returns single point at Ka\'bah', () {
final points = qiblaGreatCircle(kaabaLat, kaabaLng);
expect(points.length, equals(1));
expect((points[0][0] - kaabaLat).abs(), lessThan(0.0001));
expect((points[0][1] - kaabaLng).abs(), lessThan(0.0001));
});
test('throws RangeError for invalid coordinates', () {
expect(() => qiblaGreatCircle(91, 0), throwsRangeError);
expect(() => qiblaGreatCircle(0, 181), throwsRangeError);
});
});
group('distanceKm', () {
test('returns 0 for the same point', () {
expect(
distanceKm(40.7128, -74.006, 40.7128, -74.006).abs(),
lessThan(0.001),
);
});
test('NYC to Ka\'bah is approximately 9600 km', () {
final km = distanceKm(40.7128, -74.006, kaabaLat, kaabaLng);
expect(km, greaterThan(9000));
expect(km, lessThan(10500));
});
test('London to Ka\'bah is approximately 4950 km', () {
final km = distanceKm(51.5074, -0.1278, kaabaLat, kaabaLng);
expect(km, greaterThan(4500));
expect(km, lessThan(5500));
});
test('distance is symmetric', () {
final d1 = distanceKm(40.7128, -74.006, kaabaLat, kaabaLng);
final d2 = distanceKm(kaabaLat, kaabaLng, 40.7128, -74.006);
expect((d1 - d2).abs(), lessThan(0.001));
});
test('quarter equator is approximately 10,018 km', () {
final d = distanceKm(0, 0, 0, 90);
expect(d, greaterThan(9800));
expect(d, lessThan(10200));
});
test('pole to pole is approximately 20,000 km', () {
final d = distanceKm(90, 0, -90, 0);
expect(d, greaterThan(19000));
expect(d, lessThan(21000));
});
test('returns positive for distinct points', () {
expect(distanceKm(0, 0, 10, 10), greaterThan(0));
});
});
}