Coverage for tests/test_pipeline.py : 37%

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)
31import lsst.utils.tests
34class DummyConnections(PipelineTaskConnections, dimensions=()):
35 pass
38class AddConfig(PipelineTaskConfig, pipelineConnections=DummyConnections):
39 addend = pexConfig.Field(doc="amount to add", dtype=float, default=3.1)
42class AddTask(PipelineTask):
43 ConfigClass = AddConfig
45 def run(self, val):
46 self.metadata.add("add", self.config.addend)
47 return Struct(
48 val=val + self.config.addend,
49 )
52class MultConfig(PipelineTaskConfig, pipelineConnections=DummyConnections):
53 multiplicand = pexConfig.Field(doc="amount by which to multiply", dtype=float, default=2.5)
56class MultTask(PipelineTask):
57 ConfigClass = MultConfig
59 def run(self, val):
60 self.metadata.add("mult", self.config.multiplicand)
61 return Struct(
62 val=val * self.config.multiplicand,
63 )
66class TaskTestCase(unittest.TestCase):
67 """A test case for Task
68 """
70 def setUp(self):
71 pass
73 def tearDown(self):
74 pass
76 def testTaskDef(self):
77 """Tests for TaskDef structure
78 """
79 task1 = TaskDef("lsst.pipe.base.tests.Add", AddConfig())
80 self.assertEqual(task1.taskName, "lsst.pipe.base.tests.Add")
81 self.assertIsInstance(task1.config, AddConfig)
82 self.assertIsNone(task1.taskClass)
83 self.assertEqual(task1.label, "")
85 task2 = TaskDef("lsst.pipe.base.tests.Mult", MultConfig(), MultTask, "mult_task")
86 self.assertEqual(task2.taskName, "lsst.pipe.base.tests.Mult")
87 self.assertIsInstance(task2.config, MultConfig)
88 self.assertIs(task2.taskClass, MultTask)
89 self.assertEqual(task2.label, "mult_task")
90 self.assertEqual(task2.metadataDatasetName, "mult_task_metadata")
92 config = MultConfig()
93 config.saveMetadata = False
94 task3 = TaskDef("lsst.pipe.base.tests.Mult", config, MultTask, "mult_task")
95 self.assertIsNone(task3.metadataDatasetName)
97 def testEmpty(self):
98 """Creating empty pipeline
99 """
100 pipeline = Pipeline("test")
101 self.assertEqual(len(pipeline), 0)
103 def testInitial(self):
104 """Testing constructor with initial data
105 """
106 pipeline = Pipeline("test")
107 pipeline.addTask(AddTask, "add")
108 pipeline.addTask(MultTask, "mult")
109 self.assertEqual(len(pipeline), 2)
110 expandedPipeline = list(pipeline.toExpandedPipeline())
111 self.assertEqual(expandedPipeline[0].taskName, "AddTask")
112 self.assertEqual(expandedPipeline[1].taskName, "MultTask")
114 def testParameters(self):
115 """Test that parameters can be set and used to format
116 """
117 pipeline_str = textwrap.dedent("""
118 description: Test Pipeline
119 parameters:
120 testValue: 5.7
121 tasks:
122 add:
123 class: test_pipeline.AddTask
124 config:
125 addend: parameters.testValue
126 """)
127 # verify that parameters are used in expanding a pipeline
128 pipeline = Pipeline.fromString(pipeline_str)
129 expandedPipeline = list(pipeline.toExpandedPipeline())
130 self.assertEqual(expandedPipeline[0].config.addend, 5.7)
132 # verify that a parameter can be overridden on the "command line"
133 pipeline.addConfigOverride("parameters", "testValue", 14.9)
134 expandedPipeline = list(pipeline.toExpandedPipeline())
135 self.assertEqual(expandedPipeline[0].config.addend, 14.9)
137 # verify that a non existing parameter cant be overridden
138 with self.assertRaises(ValueError):
139 pipeline.addConfigOverride("parameters", "missingValue", 17)
141 # verify that parameters does not support files or python overrides
142 with self.assertRaises(ValueError):
143 pipeline.addConfigFile("parameters", "fakeFile")
144 with self.assertRaises(ValueError):
145 pipeline.addConfigPython("parameters", "fakePythonString")
147 def testSerialization(self):
148 pipeline = Pipeline("test")
149 pipeline.addTask(AddTask, "add")
150 pipeline.addTask(MultTask, "mult")
151 dump = str(pipeline)
152 load = Pipeline.fromString(dump)
153 self.assertEqual(pipeline, load)
156class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
157 pass
160def setup_module(module):
161 lsst.utils.tests.init()
164if __name__ == "__main__": 164 ↛ 165line 164 didn't jump to line 165, because the condition on line 164 was never true
165 lsst.utils.tests.init()
166 unittest.main()