1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
//
// Copyright 2018 Ettus Research, a National Instruments Company
//
// SPDX-License-Identifier: GPL-3.0-or-later
//
#include <boost/test/unit_test.hpp>
#include <uhdlib/usrp/constrained_device_args.hpp>
#include <iostream>
using uhd::usrp::constrained_device_args_t;
namespace {
enum test_enum_t { VALUE1, VALUE2, VALUE3=4 };
static constexpr double MAX_DOUBLE_ARG = 1e6;
static constexpr double MIN_DOUBLE_ARG = 0.125;
static constexpr double DEFAULT_DOUBLE_ARG = 2.25;
static constexpr size_t DEFAULT_SIZE_T_ARG = 42;
static constexpr bool DEFAULT_BOOL_ARG = true;
static constexpr test_enum_t DEFAULT_ENUM_ARG = VALUE1;
class test_device_args_t : public constrained_device_args_t
{
public:
test_device_args_t() {}
test_device_args_t(const std::string& dev_args) { parse(dev_args); }
double get_double_arg() const {
return _double_arg.get();
}
size_t get_size_t_arg() const {
return _size_t_arg.get();
}
bool get_bool_arg() const {
return _bool_arg.get();
}
test_enum_t get_enum_arg() const {
return _enum_arg.get();
}
inline virtual std::string to_string() const {
return _double_arg.to_string() + ", " +
_size_t_arg.to_string() + ", " +
_bool_arg.to_string() + ", " +
_enum_arg.to_string();
}
private:
virtual void _parse(const uhd::device_addr_t& dev_args) {
if (dev_args.has_key(_double_arg.key()))
_double_arg.parse(dev_args[_double_arg.key()]);
if (dev_args.has_key(_size_t_arg.key()))
_size_t_arg.parse(dev_args[_size_t_arg.key()]);
if (dev_args.has_key(_bool_arg.key()))
_bool_arg.parse(dev_args[_bool_arg.key()]);
if (dev_args.has_key(_enum_arg.key()))
_enum_arg.parse(dev_args[_enum_arg.key()]);
_enforce_range(_double_arg, MIN_DOUBLE_ARG, MAX_DOUBLE_ARG);
}
constrained_device_args_t::num_arg<double> _double_arg
{"double_arg", DEFAULT_DOUBLE_ARG};
constrained_device_args_t::num_arg<size_t> _size_t_arg
{"size_t_arg", DEFAULT_SIZE_T_ARG};
constrained_device_args_t::bool_arg _bool_arg
{"bool_arg", DEFAULT_BOOL_ARG};
constrained_device_args_t::enum_arg<test_enum_t> _enum_arg
{"enum_arg", DEFAULT_ENUM_ARG,
{{"value1", VALUE1}, {"value2", VALUE2}, {"VALUE3", VALUE3}}};
};
}
BOOST_AUTO_TEST_CASE(test_constrained_device_args) {
test_device_args_t test_dev_args("double_arg=3.5,bool_arg=0,foo=bar");
BOOST_CHECK_EQUAL(test_dev_args.get_double_arg(), 3.5);
BOOST_CHECK_EQUAL(
test_dev_args.get_size_t_arg(),
DEFAULT_SIZE_T_ARG
);
BOOST_CHECK_EQUAL(test_dev_args.get_bool_arg(), false);
BOOST_CHECK_EQUAL(
test_dev_args.get_enum_arg(),
DEFAULT_ENUM_ARG
);
BOOST_REQUIRE_THROW(
test_dev_args.parse("double_arg=2e6"),
uhd::value_error
); // Note: test_dev_args is now in a bad state until we fix it!
test_dev_args.parse("double_arg=2.6"),
test_dev_args.parse("enum_arg=vaLue2");
BOOST_CHECK_EQUAL(
test_dev_args.get_enum_arg(),
VALUE2
);
test_dev_args.parse("enum_arg=VALUE3");
BOOST_CHECK_EQUAL(
test_dev_args.get_enum_arg(),
VALUE3
);
}
|