# -*- mode: python; coding: utf-8 -*- # Copyright (c) 2018 Radio Astronomy Software Group # Licensed under the 2-clause BSD License """Tests for uvbase object. """ import pytest import numpy as np from pyuvdata.uvbase import UVBase from pyuvdata.uvbase import _warning from pyuvdata import parameter as uvp ref_latlonalt = (-26.7 * np.pi / 180.0, 116.7 * np.pi / 180.0, 377.8) ref_xyz = (-2562123.42683, 5094215.40141, -2848728.58869) class UVTest(UVBase): def __init__(self): """ UVBase test object. """ # add some test UVParameters to the class self._int1 = uvp.UVParameter( "int1", description="integer value", expected_type=int, value=3 ) self._int2 = uvp.UVParameter( "int2", description="integer value", expected_type=int, value=5 ) self._float1 = uvp.UVParameter( "float1", description="float value", expected_type=np.float, value=18.2 ) self._string1 = uvp.UVParameter( "string1", description="string value", form="str", value="test" ) self._string2 = uvp.UVParameter( "string2", description="string value", expected_type="str", value="test" ) self._floatarr = uvp.UVParameter( "floatarr", description="float array", form=("int1", "int2"), expected_type=np.float, value=np.random.rand(self._int1.value, self._int2.value), ) self._floatarr2 = uvp.UVParameter( "floatarr2", description="float array", form=4, expected_type=np.float, value=np.random.rand(4), ) self._strlist = uvp.UVParameter( "strlist", description="string list", form=("int1",), expected_type=str, value=["s" + str(i) for i in np.arange(self._int1.value)], ) self._intlist = uvp.UVParameter( "intlist", description="integer list", form=("int1",), expected_type=int, value=list(range(self._int1.value)), ) self._angle = uvp.AngleParameter( "angle", description="angle", expected_type=np.float, value=np.pi / 4.0 ) self._location = uvp.LocationParameter( "location", description="location", value=np.array(ref_xyz) ) self._optional_int1 = uvp.UVParameter( "optional_int1", description="optional integer value", expected_type=int, value=3, required=False, ) self._optional_int2 = uvp.UVParameter( "optional_int2", description="optional integer value", expected_type=int, value=5, required=False, ) self._unset_int1 = uvp.UVParameter( "unset_int1", description="An unset parameter.", expected_type=int, value=None, required=False, ) super(UVTest, self).__init__() def test_equality(): """Basic equality test.""" test_obj = UVTest() assert test_obj == test_obj def test_equality_nocheckextra(): """Test equality if optional params are different and check_extra is false.""" test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.optional_int1 = 4 assert test_obj.__eq__(test_obj2, check_extra=False) def test_inequality_extra(): """Basic equality test.""" test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.optional_int1 = 4 assert test_obj != test_obj2 def test_inequality_different_extras(): """Basic equality test.""" test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2._optional_int3 = uvp.UVParameter( "optional_int3", description="optional integer value", expected_type=int, value=7, required=False, ) assert test_obj != test_obj2 def test_inequality(): """Check that inequality is handled correctly.""" test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.float1 = 13 assert test_obj != test_obj2 def test_class_inequality(): """Test equality error for different classes.""" test_obj = UVTest() assert test_obj != test_obj._floatarr def test_check(): """Test simple check function.""" test_obj = UVTest() assert test_obj.check() def test_check_required(): """Test simple check function.""" test_obj = UVTest() assert test_obj.check(check_extra=False) def test_string_type_check(): """Test check function with wrong type (string).""" test_obj = UVTest() test_obj.string1 = 1 pytest.raises(ValueError, test_obj.check) def test_string_form_check(): """Test check function with wrong type (string).""" test_obj = UVTest() test_obj.string2 = 1 pytest.raises(ValueError, test_obj.check) def test_single_value_check(): """Test check function with wrong type.""" test_obj = UVTest() test_obj.int1 = np.float(test_obj.int1) pytest.raises(ValueError, test_obj.check) def test_check_array_type(): """Test check function with wrong array type.""" test_obj = UVTest() test_obj.floatarr = test_obj.floatarr + 1j * test_obj.floatarr pytest.raises(ValueError, test_obj.check) def test_check_array_shape(): """Test check function with wrong array dimensions.""" test_obj = UVTest() test_obj.floatarr = np.array([4, 5, 6], dtype=np.float) pytest.raises(ValueError, test_obj.check) def test_list_dims(): """Test check function with wrong list dimensions.""" test_obj = UVTest() test_obj.strlist = ["s" + str(i) for i in np.arange(test_obj.int2)] pytest.raises(ValueError, test_obj.check) def test_list_type(): """Test check function with wrong list type.""" test_obj = UVTest() test_obj.intlist = ["s" + str(i) for i in np.arange(test_obj.int1)] pytest.raises(ValueError, test_obj.check) test_obj.intlist = list(np.arange(test_obj.int1)) test_obj.intlist[1] = "test" pytest.raises(ValueError, test_obj.check) def test_angle(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.angle_degrees = 45.0 assert test_obj == test_obj2 def test_angle_none(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj.angle = None test_obj2.angle_degrees = None assert test_obj == test_obj2 def test_location(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.location_lat_lon_alt = ref_latlonalt assert test_obj == test_obj2 def test_location_degree(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj2.location_lat_lon_alt_degrees = ( np.rad2deg(ref_latlonalt[0]), np.rad2deg(ref_latlonalt[1]), ref_latlonalt[2], ) assert test_obj == test_obj2 def test_location_none(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj.location = None test_obj2.location_lat_lon_alt = None assert test_obj == test_obj2 def test_location_degree_none(): test_obj = UVTest() test_obj2 = test_obj.copy() test_obj.location = None test_obj2.location_lat_lon_alt_degrees = None assert test_obj == test_obj2 def test_warning(): output = _warning("hello world") assert output, "hello world\n" def test_check_ignore_unset(): test_obj = UVTest() test_obj._unset_int1.required = True pytest.raises(ValueError, test_obj.check) assert test_obj.check(ignore_requirements=True)