Coverage for tests/test_types.py: 100%

90 statements  

« prev     ^ index     » next       coverage.py v7.15.1, created at 2026-07-15 09:33 +0000

1import numpy as np 

2 

3from evutils.types import Event_dtype 

4 

5 

6def test_event_size() -> None: 

7 a = np.zeros(1, dtype=Event_dtype) 

8 assert a.itemsize == 13 

9 

10 

11def test_event_dtype() -> None: 

12 a = np.zeros(1, dtype=Event_dtype) 

13 a['t'] = 1 

14 a['x'] = 2 

15 a['y'] = 3 

16 a['p'] = 4 

17 

18 

19def test_soa_array_indexing() -> None: 

20 from evutils.types import EventArray, TriggerArray 

21 

22 # EventArray 

23 t = [10, 20, 30] 

24 x = [1, 2, 3] 

25 y = [4, 5, 6] 

26 p = [0, 1, 0] 

27 

28 events = EventArray(t, x, y, p) 

29 

30 # Test column access 

31 assert np.array_equal(events['t'], t) 

32 assert np.array_equal(events.t, t) 

33 

34 # Test slice indexing 

35 ev_slice = events[1:] 

36 assert isinstance(ev_slice, EventArray) 

37 assert len(ev_slice) == 2 

38 assert ev_slice.t[0] == 20 

39 

40 # Test scalar indexing (should return a void record, just like AoS) 

41 ev_single = events[1] 

42 assert isinstance(ev_single, np.void) 

43 assert ev_single['t'] == 20 

44 assert ev_single['x'] == 2 

45 

46 # TriggerArray 

47 trig_t = [100, 200] 

48 trig_p = [1, 0] 

49 trig_id = [5, 6] 

50 

51 triggers = TriggerArray(trig_t, trig_p, trig_id) 

52 

53 # Test slice indexing 

54 trig_slice = triggers[:1] 

55 assert isinstance(trig_slice, TriggerArray) 

56 assert len(trig_slice) == 1 

57 

58 # Test scalar indexing 

59 trig_single = triggers[0] 

60 assert isinstance(trig_single, np.void) 

61 assert trig_single['t'] == 100 

62 assert trig_single['id'] == 5 

63 

64 

65def test_event_array_empty() -> None: 

66 from evutils.types import EventArray 

67 empty_events = EventArray.empty() 

68 assert len(empty_events) == 0 

69 assert len(empty_events.t) == 0 

70 assert empty_events.to_aos().shape == (0,) 

71 assert repr(empty_events) == "EventArray(empty)" 

72 

73 

74def test_soa_array_negative_indexing() -> None: 

75 from evutils.types import EventArray 

76 t = [10, 20, 30] 

77 x = [1, 2, 3] 

78 y = [4, 5, 6] 

79 p = [0, 1, 0] 

80 

81 events = EventArray(t, x, y, p) 

82 

83 # Negative scalar index 

84 ev_last = events[-1] 

85 assert isinstance(ev_last, np.void) 

86 assert ev_last['t'] == 30 

87 assert ev_last['x'] == 3 

88 

89 # Negative slice 

90 ev_slice = events[-2:] 

91 assert isinstance(ev_slice, EventArray) 

92 assert len(ev_slice) == 2 

93 assert ev_slice.t[0] == 20 

94 assert ev_slice.t[1] == 30 

95 

96 

97def test_soa_array_bool_indexing() -> None: 

98 from evutils.types import EventArray 

99 t = [10, 20, 30] 

100 x = [1, 2, 3] 

101 y = [4, 5, 6] 

102 p = [0, 1, 0] 

103 

104 events = EventArray(t, x, y, p) 

105 

106 # Bool index 

107 mask = events.p == 1 

108 ev_bool = events[mask] 

109 assert isinstance(ev_bool, EventArray) 

110 assert len(ev_bool) == 1 

111 assert ev_bool.t[0] == 20 

112 

113 

114def test_soa_array_repr_long() -> None: 

115 from evutils.types import EventArray 

116 t = np.arange(20) 

117 x = np.arange(20) 

118 y = np.arange(20) 

119 p = np.zeros(20) 

120 

121 events = EventArray(t, x, y, p) 

122 rep = repr(events) 

123 assert "..." in rep 

124 assert "EventArray(n=20)" in rep 

125 

126 

127def test_trigger_array_empty() -> None: 

128 from evutils.types import TriggerArray 

129 empty_trig = TriggerArray.empty() 

130 assert len(empty_trig) == 0 

131 assert len(empty_trig.t) == 0 

132 assert empty_trig.to_aos().shape == (0,) 

133