Coverage for tests/test_pipeline.py: 47%
Shortcuts 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
Shortcuts 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
46 def run(self, val):
47 self.metadata.add("add", self.config.addend)
48 return Struct(
49 val=val + self.config.addend,
50 )
53class MultConfig(PipelineTaskConfig, pipelineConnections=DummyConnections):
54 multiplicand = pexConfig.Field(doc="amount by which to multiply", dtype=float, default=2.5)
57class MultTask(PipelineTask):
58 ConfigClass = MultConfig
60 def run(self, val):
61 self.metadata.add("mult", self.config.multiplicand)
62 return Struct(
63 val=val * self.config.multiplicand,
64 )
67class TaskTestCase(unittest.TestCase):
68 """A test case for Task
69 """
71 def setUp(self):
72 pass
74 def tearDown(self):
75 pass
77 def testTaskDef(self):
78 """Tests for TaskDef structure
79 """
80 task1 = TaskDef("lsst.pipe.base.tests.Add", AddConfig())
81 self.assertEqual(task1.taskName, "lsst.pipe.base.tests.Add")
82 self.assertIsInstance(task1.config, AddConfig)
83 self.assertIsNone(task1.taskClass)
84 self.assertEqual(task1.label, "")
86 task2 = TaskDef("lsst.pipe.base.tests.Mult", MultConfig(), MultTask, "mult_task")
87 self.assertEqual(task2.taskName, "lsst.pipe.base.tests.Mult")
88 self.assertIsInstance(task2.config, MultConfig)
89 self.assertIs(task2.taskClass, MultTask)
90 self.assertEqual(task2.label, "mult_task")
91 self.assertEqual(task2.metadataDatasetName, "mult_task_metadata")
93 config = MultConfig()
94 config.saveMetadata = False
95 task3 = TaskDef("lsst.pipe.base.tests.Mult", config, MultTask, "mult_task")
96 self.assertIsNone(task3.metadataDatasetName)
98 def testEmpty(self):
99 """Creating empty pipeline
100 """
101 pipeline = Pipeline("test")
102 self.assertEqual(len(pipeline), 0)
104 def testInitial(self):
105 """Testing constructor with initial data
106 """
107 pipeline = Pipeline("test")
108 pipeline.addTask(AddTask, "add")
109 pipeline.addTask(MultTask, "mult")
110 self.assertEqual(len(pipeline), 2)
111 expandedPipeline = list(pipeline.toExpandedPipeline())
112 self.assertEqual(expandedPipeline[0].taskName, "AddTask")
113 self.assertEqual(expandedPipeline[1].taskName, "MultTask")
115 def testParameters(self):
116 """Test that parameters can be set and used to format
117 """
118 pipeline_str = textwrap.dedent("""
119 description: Test Pipeline
120 parameters:
121 testValue: 5.7
122 tasks:
123 add:
124 class: test_pipeline.AddTask
125 config:
126 addend: parameters.testValue
127 """)
128 # verify that parameters are used in expanding a pipeline
129 pipeline = Pipeline.fromString(pipeline_str)
130 expandedPipeline = list(pipeline.toExpandedPipeline())
131 self.assertEqual(expandedPipeline[0].config.addend, 5.7)
133 # verify that a parameter can be overridden on the "command line"
134 pipeline.addConfigOverride("parameters", "testValue", 14.9)
135 expandedPipeline = list(pipeline.toExpandedPipeline())
136 self.assertEqual(expandedPipeline[0].config.addend, 14.9)
138 # verify that a non existing parameter cant be overridden
139 with self.assertRaises(ValueError):
140 pipeline.addConfigOverride("parameters", "missingValue", 17)
142 # verify that parameters does not support files or python overrides
143 with self.assertRaises(ValueError):
144 pipeline.addConfigFile("parameters", "fakeFile")
145 with self.assertRaises(ValueError):
146 pipeline.addConfigPython("parameters", "fakePythonString")
148 def testSerialization(self):
149 pipeline = Pipeline("test")
150 pipeline.addTask(AddTask, "add")
151 pipeline.addTask(MultTask, "mult")
152 dump = str(pipeline)
153 load = Pipeline.fromString(dump)
154 self.assertEqual(pipeline, load)
157class PipelineTestCase(unittest.TestCase):
158 """Test case for Pipeline and related classes
159 """
161 def test_initOutputNames(self):
162 """Test for PipelineDatasetTypes.initOutputNames method.
163 """
164 pipeline = makeSimplePipeline(3)
165 dsType = set(PipelineDatasetTypes.initOutputNames(pipeline))
166 expected = {
167 "packages",
168 "add_init_output1",
169 "add_init_output2",
170 "add_init_output3",
171 "task0_config",
172 "task1_config",
173 "task2_config",
174 }
175 self.assertEqual(dsType, expected)
178class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
179 pass
182def setup_module(module):
183 lsst.utils.tests.init()
186if __name__ == "__main__": 186 ↛ 187line 186 didn't jump to line 187, because the condition on line 186 was never true
187 lsst.utils.tests.init()
188 unittest.main()