Coverage for python/lsst/obs/base/instrument_tests.py : 41%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of obs_base.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
22"""Helpers for writing tests against subclassses of Instrument.
24These are not tests themselves, but can be subclassed (plus unittest.TestCase)
25to get a functional test of an Instrument.
26"""
28import abc
29import dataclasses
31from lsst.obs.base import Instrument
32from lsst.daf.butler import Registry
33from lsst.daf.butler import ButlerConfig
36@dataclasses.dataclass
37class InstrumentTestData:
38 """Values to test against in sublcasses of `InstrumentTests`.
39 """
41 name: str
42 """The name of the Camera this instrument describes."""
44 nDetectors: int
45 """The number of detectors in the Camera."""
47 firstDetectorName: str
48 """The name of the first detector in the Camera."""
50 physical_filters: {str}
51 """A subset of the physical filters should be registered."""
54class InstrumentTests(metaclass=abc.ABCMeta):
55 """Tests of sublcasses of Instrument.
57 TestCase subclasses must derive from this, then `TestCase`, and override
58 ``data`` and ``instrument``.
59 """
61 data = None
62 """`InstrumentTestData` containing the values to test against."""
64 instrument = None
65 """The `~lsst.obs.base.Instrument` to be tested."""
67 def test_name(self):
68 self.assertEqual(self.instrument.getName(), self.data.name)
70 def test_getCamera(self):
71 """Test that getCamera() returns a reasonable Camera definition.
72 """
73 camera = self.instrument.getCamera()
74 self.assertEqual(camera.getName(), self.instrument.getName())
75 self.assertEqual(len(camera), self.data.nDetectors)
76 self.assertEqual(next(iter(camera)).getName(), self.data.firstDetectorName)
78 def test_register(self):
79 """Test that register() sets appropriate Dimensions.
80 """
81 registry = Registry.fromConfig(ButlerConfig())
82 # check that the registry starts out empty
83 self.assertEqual(list(registry.queryDimensions(["instrument"])), [])
84 self.assertEqual(list(registry.queryDimensions(["detector"])), [])
85 self.assertEqual(list(registry.queryDimensions(["physical_filter"])), [])
87 # register the instrument and check that certain dimensions appear
88 self.instrument.register(registry)
89 instrumentDataIds = list(registry.queryDimensions(["instrument"]))
90 self.assertEqual(len(instrumentDataIds), 1)
91 instrumentNames = {dataId["instrument"] for dataId in instrumentDataIds}
92 self.assertEqual(instrumentNames, {self.data.name})
93 detectorDataIds = list(registry.queryDimensions(["detector"]))
94 self.assertEqual(len(detectorDataIds), self.data.nDetectors)
95 detectorNames = {dataId.records["detector"].full_name for dataId in detectorDataIds}
96 self.assertIn(self.data.firstDetectorName, detectorNames)
97 physicalFilterDataIds = list(registry.queryDimensions(["physical_filter"]))
98 filterNames = {dataId['physical_filter'] for dataId in physicalFilterDataIds}
99 self.assertGreaterEqual(filterNames, self.data.physical_filters)
101 # Check that the instrument class can be retrieved
102 registeredInstrument = Instrument.fromName(self.instrument.getName(), registry)
103 self.assertEqual(type(registeredInstrument), type(self.instrument))