Coverage for tests/test_pipeline.py : 39%

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 pipe_base.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (http://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"""Simple unit test for Pipeline.
23"""
25import textwrap
26import unittest
28import lsst.pex.config as pexConfig
29from lsst.pipe.base import (Struct, PipelineTask, PipelineTaskConfig, Pipeline, TaskDef,
30 PipelineTaskConnections, PipelineDatasetTypes)
31from lsst.pipe.base.tests.simpleQGraph import makeSimplePipeline
32import lsst.utils.tests
35class DummyConnections(PipelineTaskConnections, dimensions=()):
36 pass
39class AddConfig(PipelineTaskConfig, pipelineConnections=DummyConnections):
40 addend = pexConfig.Field(doc="amount to add", dtype=float, default=3.1)
43class AddTask(PipelineTask):
44 ConfigClass = AddConfig
45 _DefaultName = "add"
47 def run(self, val):
48 self.metadata.add("add", self.config.addend)
49 return Struct(
50 val=val + self.config.addend,
51 )
54class MultConfig(PipelineTaskConfig, pipelineConnections=DummyConnections):
55 multiplicand = pexConfig.Field(doc="amount by which to multiply", dtype=float, default=2.5)
58class MultTask(PipelineTask):
59 ConfigClass = MultConfig
60 _DefaultName = "mult"
62 def run(self, val):
63 self.metadata.add("mult", self.config.multiplicand)
64 return Struct(
65 val=val * self.config.multiplicand,
66 )
69class TaskTestCase(unittest.TestCase):
70 """A test case for Task
71 """
73 def setUp(self):
74 pass
76 def tearDown(self):
77 pass
79 def testTaskDef(self):
80 """Tests for TaskDef structure
81 """
82 task1 = TaskDef(taskClass=AddTask, config=AddConfig())
83 self.assertIn("Add", task1.taskName)
84 self.assertIsInstance(task1.config, AddConfig)
85 self.assertIsNotNone(task1.taskClass)
86 self.assertEqual(task1.label, "add")
88 task2 = TaskDef("lsst.pipe.base.tests.Mult", config=MultConfig(), taskClass=MultTask,
89 label="mult_task")
90 self.assertEqual(task2.taskName, "lsst.pipe.base.tests.Mult")
91 self.assertIsInstance(task2.config, MultConfig)
92 self.assertIs(task2.taskClass, MultTask)
93 self.assertEqual(task2.label, "mult_task")
94 self.assertEqual(task2.metadataDatasetName, "mult_task_metadata")
96 config = MultConfig()
97 config.saveMetadata = False
98 task3 = TaskDef("lsst.pipe.base.tests.Mult", config, MultTask, "mult_task")
99 self.assertIsNone(task3.metadataDatasetName)
101 def testEmpty(self):
102 """Creating empty pipeline
103 """
104 pipeline = Pipeline("test")
105 self.assertEqual(len(pipeline), 0)
107 def testInitial(self):
108 """Testing constructor with initial data
109 """
110 pipeline = Pipeline("test")
111 pipeline.addTask(AddTask, "add")
112 pipeline.addTask(MultTask, "mult")
113 self.assertEqual(len(pipeline), 2)
114 expandedPipeline = list(pipeline.toExpandedPipeline())
115 self.assertEqual(expandedPipeline[0].taskName, "AddTask")
116 self.assertEqual(expandedPipeline[1].taskName, "MultTask")
118 def testParameters(self):
119 """Test that parameters can be set and used to format
120 """
121 pipeline_str = textwrap.dedent("""
122 description: Test Pipeline
123 parameters:
124 testValue: 5.7
125 tasks:
126 add:
127 class: test_pipeline.AddTask
128 config:
129 addend: parameters.testValue
130 """)
131 # verify that parameters are used in expanding a pipeline
132 pipeline = Pipeline.fromString(pipeline_str)
133 expandedPipeline = list(pipeline.toExpandedPipeline())
134 self.assertEqual(expandedPipeline[0].config.addend, 5.7)
136 # verify that a parameter can be overridden on the "command line"
137 pipeline.addConfigOverride("parameters", "testValue", 14.9)
138 expandedPipeline = list(pipeline.toExpandedPipeline())
139 self.assertEqual(expandedPipeline[0].config.addend, 14.9)
141 # verify that a non existing parameter cant be overridden
142 with self.assertRaises(ValueError):
143 pipeline.addConfigOverride("parameters", "missingValue", 17)
145 # verify that parameters does not support files or python overrides
146 with self.assertRaises(ValueError):
147 pipeline.addConfigFile("parameters", "fakeFile")
148 with self.assertRaises(ValueError):
149 pipeline.addConfigPython("parameters", "fakePythonString")
151 def testSerialization(self):
152 pipeline = Pipeline("test")
153 pipeline.addTask(AddTask, "add")
154 pipeline.addTask(MultTask, "mult")
155 dump = str(pipeline)
156 load = Pipeline.fromString(dump)
157 self.assertEqual(pipeline, load)
160class PipelineTestCase(unittest.TestCase):
161 """Test case for Pipeline and related classes
162 """
164 def test_initOutputNames(self):
165 """Test for PipelineDatasetTypes.initOutputNames method.
166 """
167 pipeline = makeSimplePipeline(3)
168 dsType = set(PipelineDatasetTypes.initOutputNames(pipeline))
169 expected = {
170 "packages",
171 "add_init_output1",
172 "add_init_output2",
173 "add_init_output3",
174 "task0_config",
175 "task1_config",
176 "task2_config",
177 }
178 self.assertEqual(dsType, expected)
181class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
182 pass
185def setup_module(module):
186 lsst.utils.tests.init()
189if __name__ == "__main__": 189 ↛ 190line 189 didn't jump to line 190, because the condition on line 189 was never true
190 lsst.utils.tests.init()
191 unittest.main()