• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_TEST_TEST_CASE_FACTORY
25 #define ARM_COMPUTE_TEST_TEST_CASE_FACTORY
26 
27 #include "DatasetModes.h"
28 #include "TestCase.h"
29 #include "support/MemorySupport.h"
30 
31 #include <memory>
32 #include <string>
33 
34 namespace arm_compute
35 {
36 namespace test
37 {
38 namespace framework
39 {
40 /** Abstract factory class to create test cases. */
41 class TestCaseFactory
42 {
43 public:
44     /** Test case status.
45      *
46      * ACTIVE == Test is run and result is validated. Failure on failed validation.
47      * EXPECTED_FAILURE == Test is run and result is validated. Failure on successful validation.
48      * DISABLED == Test is not run.
49      */
50     enum class Status
51     {
52         ACTIVE,
53         EXPECTED_FAILURE,
54         DISABLED
55     };
56 
57     /** Constructor.
58      *
59      * @param[in] suite_name  Name of the test suite to which the test case has been added.
60      * @param[in] name        Name of the test case.
61      * @param[in] mode        Datset mode of the test case.
62      * @param[in] status      Status of the test case.
63      * @param[in] description Description of data arguments.
64      */
65     TestCaseFactory(std::string suite_name, std::string name, DatasetMode mode, Status status, std::string description = "");
66 
67     /** Default destructor. */
68     virtual ~TestCaseFactory() = default;
69 
70     /** Name of the test case.
71      *
72      * @return Name of the test case.
73      */
74     std::string name() const;
75 
76     /** Get the mode for which test case will be enabled.
77      *
78      * @return Dataset mode of the test case.
79      */
80     DatasetMode mode() const;
81 
82     /** Get the status of the test case.
83      *
84      * @return Status of the test case.
85      */
86     Status status() const;
87 
88     /** Factory function to create the test case
89      *
90      * @return Unique pointer to a newly created test case.
91      */
92     virtual std::unique_ptr<TestCase> make() const = 0;
93 
94 private:
95     const std::string _suite_name;
96     const std::string _test_name;
97     const std::string _data_description;
98     const DatasetMode _mode{ DatasetMode::ALL };
99     const Status      _status{ Status::ACTIVE };
100 };
101 
102 /** Implementation of a test case factory to create non-data test cases. */
103 template <typename T>
104 class SimpleTestCaseFactory final : public TestCaseFactory
105 {
106 public:
107     /** Default constructor. */
108     using TestCaseFactory::TestCaseFactory;
109 
110     std::unique_ptr<TestCase> make() const override;
111 };
112 
113 /** Implementation of a test case factory to create data test cases. */
114 template <typename T, typename D>
115 class DataTestCaseFactory final : public TestCaseFactory
116 {
117 public:
118     /** Constructor.
119      *
120      * @param[in] suite_name  Name of the test suite to which the test case has been added.
121      * @param[in] test_name   Name of the test case.
122      * @param[in] mode        Mode in which the test case is enabled.
123      * @param[in] status      Status of the test case.
124      * @param[in] description Description of data arguments.
125      * @param[in] data        Input data for the test case.
126      */
127     DataTestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description, const D &data);
128 
129     std::unique_ptr<TestCase> make() const override;
130 
131 private:
132     D _data;
133 };
134 
TestCaseFactory(std::string suite_name,std::string test_name,DatasetMode mode,Status status,std::string description)135 inline TestCaseFactory::TestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description)
136     : _suite_name{ std::move(suite_name) }, _test_name{ std::move(test_name) }, _data_description{ std::move(description) }, _mode{ mode }, _status{ status }
137 
138 {
139 }
140 
name()141 inline std::string TestCaseFactory::name() const
142 {
143     std::string name = _suite_name + "/" + _test_name;
144 
145     if(!_data_description.empty())
146     {
147         name += "@" + _data_description;
148     }
149 
150     return name;
151 }
152 
mode()153 inline DatasetMode TestCaseFactory::mode() const
154 {
155     return _mode;
156 }
157 
status()158 inline TestCaseFactory::Status TestCaseFactory::status() const
159 {
160     return _status;
161 }
162 
163 inline ::std::ostream &operator<<(::std::ostream &stream, TestCaseFactory::Status status)
164 {
165     switch(status)
166     {
167         case TestCaseFactory::Status::ACTIVE:
168             stream << "ACTIVE";
169             break;
170         case TestCaseFactory::Status::EXPECTED_FAILURE:
171             stream << "EXPECTED_FAILURE";
172             break;
173         case TestCaseFactory::Status::DISABLED:
174             stream << "DISABLED";
175             break;
176         default:
177             throw std::invalid_argument("Unsupported test case factory status");
178     }
179 
180     return stream;
181 }
182 
183 template <typename T>
make()184 inline std::unique_ptr<TestCase> SimpleTestCaseFactory<T>::make() const
185 {
186     return support::cpp14::make_unique<T>();
187 }
188 
189 template <typename T, typename D>
DataTestCaseFactory(std::string suite_name,std::string test_name,DatasetMode mode,Status status,std::string description,const D & data)190 inline DataTestCaseFactory<T, D>::DataTestCaseFactory(std::string suite_name, std::string test_name, DatasetMode mode, Status status, std::string description, const D &data)
191     : TestCaseFactory{ std::move(suite_name), std::move(test_name), mode, status, std::move(description) }, _data{ data }
192 {
193 }
194 
195 template <typename T, typename D>
make()196 inline std::unique_ptr<TestCase> DataTestCaseFactory<T, D>::make() const
197 {
198     return support::cpp14::make_unique<T>(_data);
199 }
200 } // namespace framework
201 } // namespace test
202 } // namespace arm_compute
203 #endif /* ARM_COMPUTE_TEST_TEST_CASE_FACTORY */
204