class TestDataAxis:

    def setUp(self):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        nose.tools.assert_equal(
            self.axis.value_range_to_indices(
                10.1, 10.8), (1, 8))

    def test_value_range_to_indices_endpoints(self):
        nose.tools.assert_equal(
            self.axis.value_range_to_indices(
                10, 10.9), (0, 9))

    def test_value_range_to_indices_out(self):
        nose.tools.assert_equal(
            self.axis.value_range_to_indices(
                9, 11), (0, 9))

    def test_value_range_to_indices_None(self):
        nose.tools.assert_equal(
            self.axis.value_range_to_indices(
                None, None), (0, 9))

    @nose.tools.raises(ValueError)
    def test_value_range_to_indices_v1_greater_than_v2(self):
        self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nose.tools.assert_not_equal(self.axis.offset, ac.offset)

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nose.tools.assert_equal(ac.axis[0], ac.offset)

    def test_value2index_float_in(self):
        nose.tools.assert_equal(self.axis.value2index(10.15), 2)

    def test_value2index_float_end_point_left(self):
        nose.tools.assert_equal(self.axis.value2index(10.), 0)

    def test_value2index_float_end_point_right(self):
        nose.tools.assert_equal(self.axis.value2index(10.9), 9)

    @nose.tools.raises(ValueError)
    def test_value2index_float_out(self):
        self.axis.value2index(11)

    def test_value2index_array_in(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15])).tolist(),
            [2, 2])

    def test_value2index_array_in_ceil(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.14, 10.14]),
                                  rounding=math.ceil).tolist(),
            [2, 2])

    def test_value2index_array_in_floor(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15]),
                                  rounding=math.floor).tolist(),
            [1, 1])

    @nose.tools.raises(ValueError)
    def test_value2index_array_out(self):
        self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        nose.tools.assert_equal(
            self.axis._slice_me(slice(np.float32(10.2), 10.4, 2)),
            slice(2, 4, 2))
class TestDataAxis:
    def setup_method(self, method):
        self.axis = DataAxis(size=10, scale=0.1, offset=10, units='nm')

    def test_value_range_to_indices_in_range(self):
        assert (self.axis.value_range_to_indices(10.1, 10.8) == (1, 8))

    def test_value_range_to_indices_endpoints(self):
        assert (self.axis.value_range_to_indices(10, 10.9) == (0, 9))

    def test_value_range_to_indices_out(self):
        assert (self.axis.value_range_to_indices(9, 11) == (0, 9))

    def test_value_range_to_indices_None(self):
        assert (self.axis.value_range_to_indices(None, None) == (0, 9))

    def test_value_range_to_indices_v1_greater_than_v2(self):
        with pytest.raises(ValueError):
            self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert self.axis.offset != ac.offset

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert ac.axis[0] == ac.offset

    def test_value2index_None(self):
        assert self.axis.value2index(None) is None

    def test_value2index_fail_string_in(self):
        with pytest.raises(ValueError):
            self.axis.value2index("10.15")

    def test_value2index_fail_empty_string_in(self):
        with pytest.raises(ValueError):
            self.axis.value2index("")

    def test_value2index_float_in(self):
        assert self.axis.value2index(10.15) == 2

    def test_value2index_float_end_point_left(self):
        assert self.axis.value2index(10.) == 0

    def test_value2index_float_end_point_right(self):
        assert self.axis.value2index(10.9) == 9

    def test_value2index_float_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(11)

    def test_value2index_array_in(self):
        assert (self.axis.value2index(np.array([10.15,
                                                10.15])).tolist() == [2, 2])

    def test_value2index_list_in(self):
        assert (self.axis.value2index([10.15, 10.15]).tolist() == [2, 2])

    def test_value2index_array_in_ceil(self):
        assert (self.axis.value2index(np.array([10.14, 10.14]),
                                      rounding=math.ceil).tolist() == [2, 2])

    def test_value2index_array_in_floor(self):
        assert (self.axis.value2index(np.array([10.15, 10.15]),
                                      rounding=math.floor).tolist() == [1, 1])

    def test_calibrated_value2index_list_in(self):
        np.testing.assert_allclose(
            self.axis.value2index(['0.01um', '0.0101um', '0.0103um']),
            np.array([0, 1, 3]))
        with pytest.raises(BaseException):
            self.axis.value2index(["0.01uma", '0.0101uma', '0.0103uma'])

    def test_calibrated_value2index_in(self):
        assert self.axis.value2index("0.0101um") == 1

    def test_relative_value2index_in(self):
        assert self.axis.value2index("rel0.5") == 4

    def test_relative_value2index_list_in(self):
        np.testing.assert_allclose(
            self.axis.value2index(["rel0.0", "rel0.5", "rel1.0"]),
            np.array([0, 4, 9]))

    def test_value2index_array_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        assert (self.axis._slice_me(slice(np.float32(10.2), 10.4,
                                          2)) == slice(2, 4, 2))

    def test_update_from(self):
        ax2 = DataAxis(size=2, units="nm", scale=0.5)
        self.axis.update_from(ax2, attributes=("units", "scale"))
        assert ((ax2.units, ax2.scale) == (self.axis.units, self.axis.scale))

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale * 0.3
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me.called

    def test_value_changed_event_continuous(self):
        ax = self.axis
        ax.continuous_value = True
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me_value)
        ax.events.index_changed.connect(m.trigger_me_index)
        ax.value = ax.value
        assert not m.trigger_me_value.called
        ax.value = ax.value + ax.scale * 0.3
        assert m.trigger_me_value.called
        assert not m.trigger_me_index.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me_index.called

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        assert not m.trigger_me.called
        ax.index += 1
        assert m.trigger_me.called

    def test_parse_value(self):
        ax = self.axis
        # slicing by index
        assert ax._parse_value(5) == 5
        assert type(ax._parse_value(5)) is int
        # slicing by calibrated value
        assert ax._parse_value(10.5) == 10.5
        assert type(ax._parse_value(10.5)) is float
        # slicing by unit
        assert ax._parse_value('10.5nm') == 10.5
        np.testing.assert_almost_equal(ax._parse_value('10500pm'), 10.5)

    def test_parse_value_from_relative_string(self):
        ax = self.axis
        assert ax._parse_value_from_string('rel0.0') == 10.0
        assert ax._parse_value_from_string('rel0.5') == 10.45
        assert ax._parse_value_from_string('rel1.0') == 10.9
        with pytest.raises(ValueError):
            ax._parse_value_from_string('rela0.5')
        with pytest.raises(ValueError):
            ax._parse_value_from_string('rela1.5')
        with pytest.raises(ValueError):
            ax._parse_value_from_string('abcd')

    def test_slice_empty_string(self):
        ax = self.axis
        with pytest.raises(ValueError):
            ax._parse_value("")
Exemple #3
0
class TestDataAxis:

    def setUp(self):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        nt.assert_equal(
            self.axis.value_range_to_indices(
                10.1, 10.8), (1, 8))

    def test_value_range_to_indices_endpoints(self):
        nt.assert_equal(
            self.axis.value_range_to_indices(
                10, 10.9), (0, 9))

    def test_value_range_to_indices_out(self):
        nt.assert_equal(
            self.axis.value_range_to_indices(
                9, 11), (0, 9))

    def test_value_range_to_indices_None(self):
        nt.assert_equal(
            self.axis.value_range_to_indices(
                None, None), (0, 9))

    @nt.raises(ValueError)
    def test_value_range_to_indices_v1_greater_than_v2(self):
        self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nt.assert_not_equal(self.axis.offset, ac.offset)

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nt.assert_equal(ac.axis[0], ac.offset)

    def test_value2index_float_in(self):
        nt.assert_equal(self.axis.value2index(10.15), 2)

    def test_value2index_float_end_point_left(self):
        nt.assert_equal(self.axis.value2index(10.), 0)

    def test_value2index_float_end_point_right(self):
        nt.assert_equal(self.axis.value2index(10.9), 9)

    @nt.raises(ValueError)
    def test_value2index_float_out(self):
        self.axis.value2index(11)

    def test_value2index_array_in(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15])).tolist(),
            [2, 2])

    def test_value2index_array_in_ceil(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.14, 10.14]),
                                  rounding=math.ceil).tolist(),
            [2, 2])

    def test_value2index_array_in_floor(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15]),
                                  rounding=math.floor).tolist(),
            [1, 1])

    @nt.raises(ValueError)
    def test_value2index_array_out(self):
        self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        nt.assert_equal(
            self.axis._slice_me(slice(np.float32(10.2), 10.4, 2)),
            slice(2, 4, 2))

    def test_update_from(self):
        ax2 = DataAxis(size=2, units="nm", scale=0.5)
        self.axis.update_from(ax2, attributes=("units", "scale"))
        nt.assert_equal((ax2.units, ax2.scale),
                        (self.axis.units, self.axis.scale))

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        nt.assert_false(m.trigger_me.called)
        ax.value = ax.value + ax.scale * 0.3
        nt.assert_false(m.trigger_me.called)
        ax.value = ax.value + ax.scale
        nt.assert_true(m.trigger_me.called)

    def test_value_changed_event_continuous(self):
        ax = self.axis
        ax.continuous_value = True
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me_value)
        ax.events.index_changed.connect(m.trigger_me_index)
        ax.value = ax.value
        nt.assert_false(m.trigger_me_value.called)
        ax.value = ax.value + ax.scale * 0.3
        nt.assert_true(m.trigger_me_value.called)
        nt.assert_false(m.trigger_me_index.called)
        ax.value = ax.value + ax.scale
        nt.assert_true(m.trigger_me_index.called)

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        nt.assert_false(m.trigger_me.called)
        ax.index += 1
        nt.assert_true(m.trigger_me.called)
Exemple #4
0
class TestDataAxis:
    def setUp(self):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        nt.assert_equal(self.axis.value_range_to_indices(10.1, 10.8), (1, 8))

    def test_value_range_to_indices_endpoints(self):
        nt.assert_equal(self.axis.value_range_to_indices(10, 10.9), (0, 9))

    def test_value_range_to_indices_out(self):
        nt.assert_equal(self.axis.value_range_to_indices(9, 11), (0, 9))

    def test_value_range_to_indices_None(self):
        nt.assert_equal(self.axis.value_range_to_indices(None, None), (0, 9))

    @nt.raises(ValueError)
    def test_value_range_to_indices_v1_greater_than_v2(self):
        self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nt.assert_not_equal(self.axis.offset, ac.offset)

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nt.assert_equal(ac.axis[0], ac.offset)

    def test_value2index_float_in(self):
        nt.assert_equal(self.axis.value2index(10.15), 2)

    def test_value2index_float_end_point_left(self):
        nt.assert_equal(self.axis.value2index(10.), 0)

    def test_value2index_float_end_point_right(self):
        nt.assert_equal(self.axis.value2index(10.9), 9)

    @nt.raises(ValueError)
    def test_value2index_float_out(self):
        self.axis.value2index(11)

    def test_value2index_array_in(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15])).tolist(), [2, 2])

    def test_value2index_array_in_ceil(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.14, 10.14]),
                                  rounding=math.ceil).tolist(), [2, 2])

    def test_value2index_array_in_floor(self):
        nt.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15]),
                                  rounding=math.floor).tolist(), [1, 1])

    @nt.raises(ValueError)
    def test_value2index_array_out(self):
        self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        nt.assert_equal(self.axis._slice_me(slice(np.float32(10.2), 10.4, 2)),
                        slice(2, 4, 2))

    def test_update_from(self):
        ax2 = DataAxis(size=2, units="nm", scale=0.5)
        self.axis.update_from(ax2, attributes=("units", "scale"))
        nt.assert_equal((ax2.units, ax2.scale),
                        (self.axis.units, self.axis.scale))

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        nt.assert_false(m.trigger_me.called)
        ax.value = ax.value + ax.scale * 0.3
        nt.assert_false(m.trigger_me.called)
        ax.value = ax.value + ax.scale
        nt.assert_true(m.trigger_me.called)

    def test_value_changed_event_continuous(self):
        ax = self.axis
        ax.continuous_value = True
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me_value)
        ax.events.index_changed.connect(m.trigger_me_index)
        ax.value = ax.value
        nt.assert_false(m.trigger_me_value.called)
        ax.value = ax.value + ax.scale * 0.3
        nt.assert_true(m.trigger_me_value.called)
        nt.assert_false(m.trigger_me_index.called)
        ax.value = ax.value + ax.scale
        nt.assert_true(m.trigger_me_index.called)

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        nt.assert_false(m.trigger_me.called)
        ax.index += 1
        nt.assert_true(m.trigger_me.called)
Exemple #5
0
class TestDataAxis:
    def setUp(self):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        nose.tools.assert_equal(self.axis.value_range_to_indices(10.1, 10.8),
                                (1, 8))

    def test_value_range_to_indices_endpoints(self):
        nose.tools.assert_equal(self.axis.value_range_to_indices(10, 10.9),
                                (0, 9))

    def test_value_range_to_indices_out(self):
        nose.tools.assert_equal(self.axis.value_range_to_indices(9, 11),
                                (0, 9))

    def test_value_range_to_indices_None(self):
        nose.tools.assert_equal(self.axis.value_range_to_indices(None, None),
                                (0, 9))

    @nose.tools.raises(ValueError)
    def test_value_range_to_indices_v1_greater_than_v2(self):
        self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nose.tools.assert_not_equal(self.axis.offset, ac.offset)

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        nose.tools.assert_equal(ac.axis[0], ac.offset)

    def test_value2index_float_in(self):
        nose.tools.assert_equal(self.axis.value2index(10.15), 2)

    def test_value2index_float_end_point_left(self):
        nose.tools.assert_equal(self.axis.value2index(10.), 0)

    def test_value2index_float_end_point_right(self):
        nose.tools.assert_equal(self.axis.value2index(10.9), 9)

    @nose.tools.raises(ValueError)
    def test_value2index_float_out(self):
        self.axis.value2index(11)

    def test_value2index_array_in(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15])).tolist(), [2, 2])

    def test_value2index_array_in_ceil(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.14, 10.14]),
                                  rounding=math.ceil).tolist(), [2, 2])

    def test_value2index_array_in_floor(self):
        nose.tools.assert_equal(
            self.axis.value2index(np.array([10.15, 10.15]),
                                  rounding=math.floor).tolist(), [1, 1])

    @nose.tools.raises(ValueError)
    def test_value2index_array_out(self):
        self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        nose.tools.assert_equal(
            self.axis._slice_me(slice(np.float32(10.2), 10.4, 2)),
            slice(2, 4, 2))
Exemple #6
0
class TestDataAxis:
    def setup_method(self, method):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        assert (self.axis.value_range_to_indices(10.1, 10.8) == (1, 8))

    def test_value_range_to_indices_endpoints(self):
        assert (self.axis.value_range_to_indices(10, 10.9) == (0, 9))

    def test_value_range_to_indices_out(self):
        assert (self.axis.value_range_to_indices(9, 11) == (0, 9))

    def test_value_range_to_indices_None(self):
        assert (self.axis.value_range_to_indices(None, None) == (0, 9))

    def test_value_range_to_indices_v1_greater_than_v2(self):
        with pytest.raises(ValueError):
            self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert self.axis.offset != ac.offset

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert ac.axis[0] == ac.offset

    def test_value2index_float_in(self):
        assert self.axis.value2index(10.15) == 2

    def test_value2index_float_end_point_left(self):
        assert self.axis.value2index(10.) == 0

    def test_value2index_float_end_point_right(self):
        assert self.axis.value2index(10.9) == 9

    def test_value2index_float_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(11)

    def test_value2index_array_in(self):
        assert (self.axis.value2index(np.array([10.15,
                                                10.15])).tolist() == [2, 2])

    def test_value2index_array_in_ceil(self):
        assert (self.axis.value2index(np.array([10.14, 10.14]),
                                      rounding=math.ceil).tolist() == [2, 2])

    def test_value2index_array_in_floor(self):
        assert (self.axis.value2index(np.array([10.15, 10.15]),
                                      rounding=math.floor).tolist() == [1, 1])

    def test_value2index_array_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        assert (self.axis._slice_me(slice(np.float32(10.2), 10.4,
                                          2)) == slice(2, 4, 2))

    def test_update_from(self):
        ax2 = DataAxis(size=2, units="nm", scale=0.5)
        self.axis.update_from(ax2, attributes=("units", "scale"))
        assert ((ax2.units, ax2.scale) == (self.axis.units, self.axis.scale))

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale * 0.3
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me.called

    def test_value_changed_event_continuous(self):
        ax = self.axis
        ax.continuous_value = True
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me_value)
        ax.events.index_changed.connect(m.trigger_me_index)
        ax.value = ax.value
        assert not m.trigger_me_value.called
        ax.value = ax.value + ax.scale * 0.3
        assert m.trigger_me_value.called
        assert not m.trigger_me_index.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me_index.called

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        assert not m.trigger_me.called
        ax.index += 1
        assert m.trigger_me.called
Exemple #7
0
class TestDataAxis:

    def setup_method(self, method):
        self.axis = DataAxis(size=10, scale=0.1, offset=10)

    def test_value_range_to_indices_in_range(self):
        assert (
            self.axis.value_range_to_indices(
                10.1, 10.8) == (1, 8))

    def test_value_range_to_indices_endpoints(self):
        assert (
            self.axis.value_range_to_indices(
                10, 10.9) == (0, 9))

    def test_value_range_to_indices_out(self):
        assert (
            self.axis.value_range_to_indices(
                9, 11) == (0, 9))

    def test_value_range_to_indices_None(self):
        assert (
            self.axis.value_range_to_indices(
                None, None) == (0, 9))

    def test_value_range_to_indices_v1_greater_than_v2(self):
        with pytest.raises(ValueError):
            self.axis.value_range_to_indices(2, 1)

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert self.axis.offset != ac.offset

    def test_deepcopy_on_trait_change(self):
        ac = copy.deepcopy(self.axis)
        ac.offset = 100
        assert ac.axis[0] == ac.offset

    def test_value2index_float_in(self):
        assert self.axis.value2index(10.15) == 2

    def test_value2index_float_end_point_left(self):
        assert self.axis.value2index(10.) == 0

    def test_value2index_float_end_point_right(self):
        assert self.axis.value2index(10.9) == 9

    def test_value2index_float_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(11)

    def test_value2index_array_in(self):
        assert (
            self.axis.value2index(np.array([10.15, 10.15])).tolist() ==
            [2, 2])

    def test_value2index_array_in_ceil(self):
        assert (
            self.axis.value2index(np.array([10.14, 10.14]),
                                  rounding=math.ceil).tolist() ==
            [2, 2])

    def test_value2index_array_in_floor(self):
        assert (
            self.axis.value2index(np.array([10.15, 10.15]),
                                  rounding=math.floor).tolist() ==
            [1, 1])

    def test_value2index_array_out(self):
        with pytest.raises(ValueError):
            self.axis.value2index(np.array([10, 11]))

    def test_slice_me(self):
        assert (
            self.axis._slice_me(slice(np.float32(10.2), 10.4, 2)) ==
            slice(2, 4, 2))

    def test_update_from(self):
        ax2 = DataAxis(size=2, units="nm", scale=0.5)
        self.axis.update_from(ax2, attributes=("units", "scale"))
        assert ((ax2.units, ax2.scale) ==
                (self.axis.units, self.axis.scale))

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale * 0.3
        assert not m.trigger_me.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me.called

    def test_value_changed_event_continuous(self):
        ax = self.axis
        ax.continuous_value = True
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me_value)
        ax.events.index_changed.connect(m.trigger_me_index)
        ax.value = ax.value
        assert not m.trigger_me_value.called
        ax.value = ax.value + ax.scale * 0.3
        assert m.trigger_me_value.called
        assert not m.trigger_me_index.called
        ax.value = ax.value + ax.scale
        assert m.trigger_me_index.called

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        assert not m.trigger_me.called
        ax.index += 1
        assert m.trigger_me.called
class TestDataAxis:

    def setup_method(self, method):
        self._axis = np.arange(16)**2
        self.axis = DataAxis(axis=self._axis)

    def _test_initialisation_parameters(self, axis):
        np.testing.assert_allclose(axis.axis, self._axis)

    def test_initialisation_parameters(self):
        self._test_initialisation_parameters(self.axis)

    def test_create_axis(self):
        axis = create_axis(**self.axis.get_axis_dictionary())
        assert isinstance(axis, DataAxis)
        self._test_initialisation_parameters(axis)

    def test_axis_value(self):
        assert_allclose(self.axis.axis, np.arange(16)**2)
        assert self.axis.size == 16
        assert not self.axis.is_uniform

    def test_update_axes(self):
        values = np.arange(20)**2
        self.axis.axis = values.tolist()
        self.axis.update_axis()
        assert self.axis.size == 20
        assert_allclose(self.axis.axis, values)

    def test_update_axes2(self):
        values = np.array([3, 4, 10, 40])
        self.axis.axis = values
        self.axis.update_axis()
        assert_allclose(self.axis.axis, values)

    def test_update_axis_from_list(self):
        values = np.arange(16)**2
        self.axis.axis = values.tolist()
        self.axis.update_axis()
        assert_allclose(self.axis.axis, values)

    def test_unsorted_axis(self):
        with pytest.raises(ValueError):
            DataAxis(axis=np.array([10, 40, 1, 30, 20]))

    def test_index_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.index_changed.connect(m.trigger_me)
        ax.index = ax.index
        assert not m.trigger_me.called
        ax.index += 1
        assert m.trigger_me.called

    def test_value_changed_event(self):
        ax = self.axis
        m = mock.Mock()
        ax.events.value_changed.connect(m.trigger_me)
        ax.value = ax.value
        assert not m.trigger_me.called
        ax.value = ax.value + (ax.axis[1] - ax.axis[0]) * 0.4
        assert not m.trigger_me.called
        ax.value = ax.value + (ax.axis[1] - ax.axis[0]) / 2
        assert not m.trigger_me.called
        ax.value = ax.axis[1]
        assert m.trigger_me.called

    def test_deepcopy(self):
        ac = copy.deepcopy(self.axis)
        np.testing.assert_allclose(ac.axis, np.arange(16)**2)
        ac.name = 'name changed'
        assert ac.name == 'name changed'
        assert self.axis.name != ac.name

    def test_slice_me(self):
        assert self.axis._slice_me(slice(1, 5)) == slice(1, 5)
        assert self.axis.size == 4
        np.testing.assert_allclose(self.axis.axis, np.arange(1, 5)**2)

    def test_slice_me_step(self):
        assert self.axis._slice_me(slice(0, 10, 2)) == slice(0, 10, 2)
        assert self.axis.size == 5
        np.testing.assert_allclose(self.axis.axis, np.arange(0, 10, 2)**2)

    def test_convert_to_uniform_axis(self):
        scale = (self.axis.high_value - self.axis.low_value) / self.axis.size
        is_binned = self.axis.is_binned
        navigate = self.axis.navigate
        self.axis.name = "parrot"
        self.axis.units = "plumage"
        s = Signal1D(np.arange(10), axes=[self.axis])
        index_in_array = s.axes_manager[0].index_in_array
        s.axes_manager[0].convert_to_uniform_axis()
        assert isinstance(s.axes_manager[0], UniformDataAxis)
        assert s.axes_manager[0].name == "parrot"
        assert s.axes_manager[0].units == "plumage"
        assert s.axes_manager[0].size == 16
        assert s.axes_manager[0].scale == scale
        assert s.axes_manager[0].offset == 0
        assert s.axes_manager[0].low_value == 0
        assert s.axes_manager[0].high_value == 15 * scale
        assert index_in_array == s.axes_manager[0].index_in_array
        assert is_binned == s.axes_manager[0].is_binned
        assert navigate == s.axes_manager[0].navigate

    def test_value2index(self):
        assert self.axis.value2index(10.15) == 3
        assert self.axis.value2index(60) == 8
        assert self.axis.value2index(2.5, rounding=round) == 1
        assert self.axis.value2index(2.5, rounding=math.ceil) == 2
        assert self.axis.value2index(2.5, rounding=math.floor) == 1
        # Test that output is integer
        assert isinstance(self.axis.value2index(60), (int, np.integer))
        self.axis.axis = self.axis.axis - 2
        # test rounding on negative value
        assert self.axis.value2index(-1.5, rounding=round) == 1


    def test_value2index_error(self):
        with pytest.raises(ValueError):
            self.axis.value2index(226)

    def test_parse_value_from_relative_string(self):
        ax = self.axis
        assert ax._parse_value_from_string('rel0.0') == 0.0
        assert ax._parse_value_from_string('rel0.5') == 112.5
        assert ax._parse_value_from_string('rel1.0') == 225.0
        with pytest.raises(ValueError):
            ax._parse_value_from_string('rela0.5')
        with pytest.raises(ValueError):
            ax._parse_value_from_string('rel1.5')
        with pytest.raises(ValueError):
            ax._parse_value_from_string('abcd')

    def test_parse_value_from_string_with_units(self):
        ax = self.axis
        ax.units = 'nm'
        with pytest.raises(ValueError):
            ax._parse_value_from_string('0.02 um')

    @pytest.mark.parametrize("use_indices", (False, True))
    def test_crop(self, use_indices):
        axis = DataAxis(axis=self._axis)
        start, end = 4., 196.
        if use_indices:
            start = axis.value2index(start)
            end = axis.value2index(end)
        axis.crop(start, end)
        assert axis.size == 12
        np.testing.assert_almost_equal(axis.axis[0], 4)
        np.testing.assert_almost_equal(axis.axis[-1], 169)

    def test_crop_reverses_indexing(self):
        # reverse indexing
        axis = DataAxis(axis=self._axis)
        axis.crop(-14, -2)
        assert axis.size == 12
        np.testing.assert_almost_equal(axis.axis[0], 4)
        np.testing.assert_almost_equal(axis.axis[-1], 169)

        # mixed reverses indexing
        axis = DataAxis(axis=self._axis)
        axis.crop(2, -2)
        assert axis.size == 12
        np.testing.assert_almost_equal(axis.axis[0], 4)
        np.testing.assert_almost_equal(axis.axis[-1], 169)

    def test_error_DataAxis(self):
        with pytest.raises(ValueError):
            _ = DataAxis(axis=np.arange(16)**2, _type='UniformDataAxis')
        with pytest.raises(AttributeError):
            self.axis.index_in_axes_manager()
        with pytest.raises(IndexError):
            self.axis._get_positive_index(-17)
        with pytest.raises(ValueError):
            self.axis._get_array_slices(slice_=slice(1,2,1.5))
        with pytest.raises(IndexError):
            self.axis._get_array_slices(slice_=slice(225,-1.1,1))
        with pytest.raises(IndexError):
            self.axis._get_array_slices(slice_=slice(225.1,0,1))

    def test_update_from(self):
        ax2 = DataAxis(units="plumage", name="parrot", axis=np.arange(16))
        self.axis.update_from(ax2, attributes=("units", "name"))
        assert ((ax2.units, ax2.name) ==
                (self.axis.units, self.axis.name))

    def test_calibrate(self):
        with pytest.raises(TypeError, match="only for uniform axes"):
            self.axis.calibrate(value_tuple=(11,12), index_tuple=(0,5))