test_decode_hardware_json.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import base64
  2. import unittest
  3. import numpy as np
  4. from nmr_processor import NMRParams, decode_hardware_json
  5. def _b64_from_int16(values):
  6. arr = np.asarray(values, dtype=np.int16)
  7. return base64.b64encode(arr.tobytes()).decode("ascii")
  8. class DecodeHardwareJsonTests(unittest.TestCase):
  9. def test_scalar_points_and_rate(self):
  10. data = [{
  11. "averaging_num": 0,
  12. "data_num": 0,
  13. "measurement_rate": 8_000_000,
  14. "measurement_points": 4,
  15. "channel_data": [
  16. {"channel_num": 1, "channel_data": _b64_from_int16([1, 2, 3, 4, 5])}
  17. ],
  18. }]
  19. signal, sample_rate = decode_hardware_json(data, NMRParams(channel_num=1))
  20. self.assertEqual(len(signal), 4)
  21. self.assertEqual(sample_rate, 8_000_000.0)
  22. def test_list_points_selected_by_channel(self):
  23. data = [{
  24. "averaging_num": 0,
  25. "data_num": 0,
  26. "measurement_rate": 8_000_000,
  27. "measurement_points": [3, 5],
  28. "channel_data": [
  29. {"channel_num": 1, "channel_data": _b64_from_int16([10, 20, 30, 40, 50, 60])}
  30. ],
  31. }]
  32. signal, sample_rate = decode_hardware_json(data, NMRParams(channel_num=1))
  33. self.assertEqual(len(signal), 5)
  34. self.assertEqual(sample_rate, 8_000_000.0)
  35. def test_list_rate_selected_by_channel(self):
  36. data = [{
  37. "averaging_num": 0,
  38. "data_num": 0,
  39. "measurement_rate": [4_000_000, 8_000_000],
  40. "measurement_points": [3, 3],
  41. "channel_data": [
  42. {"channel_num": 1, "channel_data": _b64_from_int16([10, 20, 30])}
  43. ],
  44. }]
  45. signal, sample_rate = decode_hardware_json(data, NMRParams(channel_num=1))
  46. self.assertEqual(len(signal), 3)
  47. self.assertEqual(sample_rate, 8_000_000.0)
  48. def test_out_of_range_channel_points_raises_clear_error(self):
  49. data = [{
  50. "averaging_num": 0,
  51. "data_num": 0,
  52. "measurement_rate": 8_000_000,
  53. "measurement_points": [3],
  54. "channel_data": [
  55. {"channel_num": 1, "channel_data": _b64_from_int16([10, 20, 30])}
  56. ],
  57. }]
  58. with self.assertRaisesRegex(
  59. ValueError,
  60. r"measurement_points.*channel_num=1",
  61. ):
  62. decode_hardware_json(data, NMRParams(channel_num=1))
  63. def test_out_of_range_channel_rate_raises_clear_error(self):
  64. data = [{
  65. "averaging_num": 0,
  66. "data_num": 0,
  67. "measurement_rate": [8_000_000],
  68. "measurement_points": [3, 3],
  69. "channel_data": [
  70. {"channel_num": 1, "channel_data": _b64_from_int16([10, 20, 30])}
  71. ],
  72. }]
  73. with self.assertRaisesRegex(
  74. ValueError,
  75. r"measurement_rate.*channel_num=1",
  76. ):
  77. decode_hardware_json(data, NMRParams(channel_num=1))
  78. if __name__ == "__main__":
  79. unittest.main()