2828
2929#include < boost/test/unit_test.hpp>
3030
31+ using namespace std ;
32+ using namespace solidity ::test;
33+
34+ namespace boost ::test_tools::tt_detail
35+ {
36+
37+ template <>
38+ struct print_log_value <std::optional<int >>
39+ {
40+ void operator ()(std::ostream& _out, std::optional<int > const & _value) const
41+ {
42+ _out << (_value ? to_string (*_value) : " [nullopt]" );
43+ }
44+ };
45+
46+ template <>
47+ struct print_log_value <nullopt_t >
48+ {
49+ void operator ()(std::ostream& _out, nullopt_t const &) const
50+ {
51+ _out << " [nullopt]" ;
52+ }
53+ };
54+
55+ } // namespace boost::test_tools::tt_detail
56+
57+
3158namespace solidity ::langutil::test
3259{
3360
@@ -48,6 +75,62 @@ BOOST_AUTO_TEST_CASE(test_fail)
4875 );
4976}
5077
78+ namespace
79+ {
80+ std::optional<int > toPosition (int _line, int _column, string const & _text)
81+ {
82+ return CharStream{_text, " source" }.translateLineColumnToPosition (
83+ LineColumn{_line, _column}
84+ );
85+ }
86+
87+ }
88+
89+ BOOST_AUTO_TEST_CASE (translateLineColumnToPosition)
90+ {
91+ BOOST_CHECK_EQUAL (toPosition (-1 , 0 , " ABC" ), nullopt );
92+ BOOST_CHECK_EQUAL (toPosition (0 , -1 , " ABC" ), nullopt );
93+
94+ BOOST_CHECK_EQUAL (toPosition (0 , 0 , " " ), 0 );
95+ BOOST_CHECK_EQUAL (toPosition (1 , 0 , " " ), nullopt );
96+ BOOST_CHECK_EQUAL (toPosition (0 , 1 , " " ), nullopt );
97+
98+ // With last line containing no LF
99+ BOOST_CHECK_EQUAL (toPosition (0 , 0 , " ABC" ), 0 );
100+ BOOST_CHECK_EQUAL (toPosition (0 , 1 , " ABC" ), 1 );
101+ BOOST_CHECK_EQUAL (toPosition (0 , 2 , " ABC" ), 2 );
102+ BOOST_CHECK_EQUAL (toPosition (0 , 3 , " ABC" ), 3 );
103+ BOOST_CHECK_EQUAL (toPosition (0 , 4 , " ABC" ), nullopt );
104+ BOOST_CHECK_EQUAL (toPosition (1 , 0 , " ABC" ), nullopt );
105+
106+ BOOST_CHECK_EQUAL (toPosition (0 , 3 , " ABC\n DEF" ), 3 );
107+ BOOST_CHECK_EQUAL (toPosition (0 , 4 , " ABC\n DEF" ), nullopt );
108+ BOOST_CHECK_EQUAL (toPosition (1 , 0 , " ABC\n DEF" ), 4 );
109+ BOOST_CHECK_EQUAL (toPosition (1 , 1 , " ABC\n DEF" ), 5 );
110+ BOOST_CHECK_EQUAL (toPosition (1 , 2 , " ABC\n DEF" ), 6 );
111+ BOOST_CHECK_EQUAL (toPosition (1 , 3 , " ABC\n DEF" ), 7 );
112+ BOOST_CHECK_EQUAL (toPosition (1 , 4 , " ABC\n DEF" ), nullopt );
113+ BOOST_CHECK_EQUAL (toPosition (2 , 0 , " ABC\n DEF" ), nullopt );
114+ BOOST_CHECK_EQUAL (toPosition (2 , 1 , " ABC\n DEF" ), nullopt );
115+
116+ // With last line containing LF
117+ BOOST_CHECK_EQUAL (toPosition (0 , 0 , " ABC\n DEF\n " ), 0 );
118+ BOOST_CHECK_EQUAL (toPosition (0 , 1 , " ABC\n DEF\n " ), 1 );
119+ BOOST_CHECK_EQUAL (toPosition (0 , 2 , " ABC\n DEF\n " ), 2 );
120+
121+ BOOST_CHECK_EQUAL (toPosition (1 , 0 , " ABC\n DEF\n " ), 4 );
122+ BOOST_CHECK_EQUAL (toPosition (1 , 1 , " ABC\n DEF\n " ), 5 );
123+ BOOST_CHECK_EQUAL (toPosition (1 , 2 , " ABC\n DEF\n " ), 6 );
124+ BOOST_CHECK_EQUAL (toPosition (1 , 3 , " ABC\n DEF\n " ), 7 );
125+ BOOST_CHECK_EQUAL (toPosition (1 , 4 , " ABC\n DEF\n " ), nullopt );
126+ BOOST_CHECK_EQUAL (toPosition (2 , 0 , " ABC\n DEF\n " ), 8 );
127+ BOOST_CHECK_EQUAL (toPosition (2 , 1 , " ABC\n DEF\n " ), nullopt );
128+
129+ BOOST_CHECK_EQUAL (toPosition (2 , 0 , " ABC\n DEF\n GHI\n " ), 8 );
130+ BOOST_CHECK_EQUAL (toPosition (2 , 1 , " ABC\n DEF\n GHI\n " ), 9 );
131+ BOOST_CHECK_EQUAL (toPosition (2 , 2 , " ABC\n DEF\n GHI\n " ), 10 );
132+ }
133+
51134BOOST_AUTO_TEST_SUITE_END ()
52135
53- } // end namespaces
136+ }
0 commit comments