#!/usr/bin/python3

import lib.pa_sun as PS
import unittest as UT

class test_approximate_position_of_sun(UT.TestCase):
	def setUp(self):
		self.lct_hours = 0
		self.lct_minutes = 0
		self.lct_seconds = 0
		self.local_day = 27
		self.local_month = 7
		self.local_year = 2003
		self.is_daylight_saving = False
		self.zone_correction = 0

	def test_approximate_position_of_sun(self):
		sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec = PS.approximate_position_of_sun(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction)

		print(f"Approximate position of the sun: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [RA] {sun_ra_hour}:{sun_ra_min}:{sun_ra_sec} [Dec] {sun_dec_deg}d {sun_dec_min}m {sun_dec_sec}s")

		self.assertEqual(sun_ra_hour,8,"Sun RA Hour")
		self.assertEqual(sun_ra_min,23,"Sun RA Minutes")
		self.assertEqual(sun_ra_sec,33.73,"Sun RA Seconds")
		self.assertEqual(sun_dec_deg,19,"Sun Dec Degrees")
		self.assertEqual(sun_dec_min,21,"Sun Dec Minutes")
		self.assertEqual(sun_dec_sec,14.33,"Sun Dec Seconds")

class test_precise_position_of_sun(UT.TestCase):
	def setUp(self):
		self.lct_hours = 0
		self.lct_minutes = 0
		self.lct_seconds = 0
		self.local_day = 27
		self.local_month = 7
		self.local_year = 1988
		self.is_daylight_saving = False
		self.zone_correction = 0

	def test_precise_position_of_sun(self):
		sun_ra_hour,sun_ra_min,sun_ra_sec,sun_dec_deg,sun_dec_min,sun_dec_sec = PS.precise_position_of_sun(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction)

		print(f"Precise position of the sun: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [RA] {sun_ra_hour}:{sun_ra_min}:{sun_ra_sec} [Dec] {sun_dec_deg}d {sun_dec_min}m {sun_dec_sec}s")

		self.assertEqual(sun_ra_hour,8,"Sun RA Hour")
		self.assertEqual(sun_ra_min,26,"Sun RA Minutes")
		self.assertEqual(sun_ra_sec,3.83,"Sun RA Seconds")
		self.assertEqual(sun_dec_deg,19,"Sun Dec Degrees")
		self.assertEqual(sun_dec_min,12,"Sun Dec Minutes")
		self.assertEqual(sun_dec_sec,49.72,"Sun Dec Seconds")

class test_sun_distance_and_angular_size(UT.TestCase):
	def setUp(self):
		self.lct_hours = 0
		self.lct_minutes = 0
		self.lct_seconds = 0
		self.local_day = 27
		self.local_month = 7
		self.local_year = 1988
		self.is_daylight_saving = False
		self.zone_correction = 0

	def test_sun_distance_and_angular_size(self):
		sun_dist_km,sun_ang_size_deg,sun_ang_size_min,sun_ang_size_sec = PS.sun_distance_and_angular_size(self.lct_hours, self.lct_minutes, self.lct_seconds, self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction)

		print(f"Sun's distance and angular size: [Local Time] {self.lct_hours}:{self.lct_minutes}:{self.lct_seconds} [Local Day] {self.local_month}/{self.local_day}/{self.local_year} [DST] {self.is_daylight_saving} [Zone Correction] {self.zone_correction} = [Sun] [Dist km] {sun_dist_km} [Angular size] {sun_ang_size_deg}d {sun_ang_size_min}m {sun_ang_size_sec}s")

		self.assertEqual(sun_dist_km,151920100,"Sun Distance in km")
		self.assertEqual(sun_ang_size_deg,0,"Sun Angular Size Degrees")
		self.assertEqual(sun_ang_size_min,31,"Sun Angular Size Minutes")
		self.assertEqual(sun_ang_size_sec,29.93,"Sun Angular Size Seconds")

class test_sunrise_and_sunset(UT.TestCase):
	def setUp(self):
		self.local_day = 10
		self.local_month = 3
		self.local_year = 1986
		self.is_daylight_saving = False
		self.zone_correction = -5
		self.geographical_long_deg = -71.05
		self.geographical_lat_deg = 42.37

	def test_sunrise_and_sunset(self):
		local_sunrise_hour,local_sunrise_minute,local_sunset_hour,local_sunset_minute,azimuth_of_sunrise_deg,azimuth_of_sunset_deg,status = PS.sunrise_and_sunset(self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction, self.geographical_long_deg, self.geographical_lat_deg)

		print(f"Sunrise and sunset: [Local date] {self.local_month}/{self.local_day}/{self.local_year} [DST?] {self.is_daylight_saving} [TZ Correction] {self.zone_correction} [Lat/Long] {self.geographical_lat_deg}/{self.geographical_long_deg} = [Sunrise] [time] {local_sunrise_hour}:{local_sunrise_minute} [Azimuth] {azimuth_of_sunrise_deg}, [Sunset] [time] {local_sunset_hour}:{local_sunset_minute} [Azimuth] {azimuth_of_sunset_deg}, [Status] {status}")

		self.assertEqual(local_sunrise_hour,6,"Local Sunrise Hour")
		self.assertEqual(local_sunrise_minute,5,"Local Sunrise Minute")
		self.assertEqual(local_sunset_hour,17,"Local Sunset Hour")
		self.assertEqual(local_sunset_minute,45,"Local Sunset Minute")
		self.assertEqual(azimuth_of_sunrise_deg,94.83,"Azimuth of Sunrise (degrees)")
		self.assertEqual(azimuth_of_sunset_deg,265.43,"Azimuth of Sunset (degrees)")
		self.assertEqual(status,"OK","Status of Calculation")

class test_morning_and_evening_twilight(UT.TestCase):
	def setUp(self):
		self.local_day = 7
		self.local_month = 9
		self.local_year = 1979
		self.is_daylight_saving = False
		self.zone_correction = 0
		self.geographical_long_deg = 0
		self.geographical_lat_deg = 52
		self.twilight_type = "A"

	def test_morning_and_evening_twilight(self):
		am_twilight_begins_hour,am_twilight_begins_min,pm_twilight_ends_hour,pm_twilight_ends_min,status = PS.morning_and_evening_twilight(self.local_day, self.local_month, self.local_year, self.is_daylight_saving, self.zone_correction, self.geographical_long_deg, self.geographical_lat_deg, self.twilight_type)

		print(f"Morning and evening twilight: [Local date] {self.local_month}/{self.local_day}/{self.local_year} [DST?] {self.is_daylight_saving} [TZ Correction] {self.zone_correction} [Lat/Long] {self.geographical_lat_deg}/{self.geographical_long_deg} [Twilight Type] {self.twilight_type} = [AM Twilight Begins] {am_twilight_begins_hour}:{am_twilight_begins_min} [PM Twilight Ends] {pm_twilight_ends_hour}:{pm_twilight_ends_min}, [Status] {status}")

		self.assertEqual(am_twilight_begins_hour,3,"AM Twilight Begins (hour)")
		self.assertEqual(am_twilight_begins_min,17,"AM Twilight Begins (minute)")
		self.assertEqual(pm_twilight_ends_hour,20,"PM Twilight Ends (hour)")
		self.assertEqual(pm_twilight_ends_min,37,"PM Twilight Ends (minute)")
		self.assertEqual(status,"OK","Status of Calculation")

class test_equation_of_time(UT.TestCase):
	def setUp(self):
		self.gwdate_day = 27
		self.gwdate_month = 7
		self.gwdate_year = 2010

	def test_equation_of_time(self):
		equation_of_time_min, equation_of_time_sec = PS.equation_of_time(self.gwdate_day,self.gwdate_month,self.gwdate_year)

		print(f"Equation of Time:  [Greenwich Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Equation of Time] {equation_of_time_min}:{equation_of_time_sec}")

		self.assertEqual(equation_of_time_min,6,"Equation of Time (min)")
		self.assertEqual(equation_of_time_sec,31.52,"Equation of Time (sec)")

class test_solar_elongation(UT.TestCase):
	def setUp(self):
		self.ra_hour = 10
		self.ra_min = 6
		self.ra_sec = 45
		self.dec_deg = 11
		self.dec_min = 57
		self.dec_sec = 27
		self.gwdate_day = 27.8333333
		self.gwdate_month = 7
		self.gwdate_year = 2010

	def test_solar_elongation(self):
		solar_elongation_deg = PS.solar_elongation(self.ra_hour,self.ra_min,self.ra_sec,self.dec_deg,self.dec_min,self.dec_sec,self.gwdate_day,self.gwdate_month,self.gwdate_year)

		print(f"Solar elongation: [Right Ascension] {self.ra_hour}:{self.ra_min}:{self.ra_sec} [Declination] {self.dec_deg}d {self.dec_min}m {self.dec_sec}s [Greenwich Date] {self.gwdate_month}/{self.gwdate_day}/{self.gwdate_year} = [Solar Elongation (degrees)] {solar_elongation_deg}")

		self.assertEqual(solar_elongation_deg,24.78,"Solar Elongation (degrees)")


if __name__ == '__main__':
	UT.main()
