@@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see
#include "backtrace.h"
#include "diagnostic.h"
#include "diagnostic-color.h"
+#include "selftest.h"
#ifdef HAVE_TERMIOS_H
# include <termios.h>
@@ -442,6 +443,118 @@ layout_range::contains_point (int row, int column) const
return column <= m_finish.m_column;
}
+#if CHECKING_P
+
+/* A helper function for testing layout_range::contains_point. */
+
+static layout_range
+make_range (int start_line, int start_col,
+ int end_line, int end_col)
+{
+ const expanded_location start_exploc
+ = {"test.c", start_line, start_col, NULL, false};
+ const expanded_location finish_exploc
+ = {"test.c", end_line, end_col, NULL, false};
+ return layout_range (&start_exploc, &finish_exploc, false,
+ &start_exploc);
+}
+
+/* Selftests for layout_range::contains_point. */
+
+static void
+test_range_contains_point_for_single_point ()
+{
+ /* A range with start==end. */
+ layout_range point = make_range (7, 10, 7, 10);
+
+ /* Before the line. */
+ ASSERT_FALSE (point.contains_point (6, 1));
+
+ /* On the line, but before start. */
+ ASSERT_FALSE (point.contains_point (7, 9));
+
+ /* At the point. */
+ ASSERT_TRUE (point.contains_point (7, 10));
+
+ /* On the line, after the point. */
+ ASSERT_FALSE (point.contains_point (7, 11));
+
+ /* After the line. */
+ ASSERT_FALSE (point.contains_point (8, 1));
+}
+
+static void
+test_range_contains_point_test_for_single_line ()
+{
+ /* The single-line example from above. */
+ layout_range example_a = make_range (2, 22, 2, 38);
+
+ /* Before the line. */
+ ASSERT_FALSE (example_a.contains_point (1, 1));
+
+ /* On the line, but before start. */
+ ASSERT_FALSE (example_a.contains_point (2, 21));
+
+ /* On the line, at the start. */
+ ASSERT_TRUE (example_a.contains_point (2, 22));
+
+ /* On the line, within the range. */
+ ASSERT_TRUE (example_a.contains_point (2, 23));
+
+ /* On the line, at the end. */
+ ASSERT_TRUE (example_a.contains_point (2, 38));
+
+ /* On the line, after the end. */
+ ASSERT_FALSE (example_a.contains_point (2, 39));
+
+ /* After the line. */
+ ASSERT_FALSE (example_a.contains_point (2, 39));
+}
+
+static void
+test_range_contains_point_for_multiple_lines ()
+{
+ /* The multi-line example from above. */
+ layout_range example_b = make_range (3, 14, 5, 8);
+
+ /* Before first line. */
+ ASSERT_FALSE (example_b.contains_point (1, 1));
+
+ /* On the first line, but before start. */
+ ASSERT_FALSE (example_b.contains_point (3, 13));
+
+ /* At the start. */
+ ASSERT_TRUE (example_b.contains_point (3, 14));
+
+ /* On the first line, within the range. */
+ ASSERT_TRUE (example_b.contains_point (3, 15));
+
+ /* On an interior line.
+ The column number should not matter; try various boundary
+ values. */
+ ASSERT_TRUE (example_b.contains_point (4, 1));
+ ASSERT_TRUE (example_b.contains_point (4, 7));
+ ASSERT_TRUE (example_b.contains_point (4, 8));
+ ASSERT_TRUE (example_b.contains_point (4, 9));
+ ASSERT_TRUE (example_b.contains_point (4, 13));
+ ASSERT_TRUE (example_b.contains_point (4, 14));
+ ASSERT_TRUE (example_b.contains_point (4, 15));
+
+ /* On the final line, before the end. */
+ ASSERT_TRUE (example_b.contains_point (5, 7));
+
+ /* On the final line, at the end. */
+ ASSERT_TRUE (example_b.contains_point (5, 8));
+
+ /* On the final line, after the end. */
+ ASSERT_FALSE (example_b.contains_point (5, 9));
+
+ /* After the line. */
+ ASSERT_FALSE (example_b.contains_point (6, 1));
+}
+
+#endif /* #if CHECKING_P */
+
/* Given a source line LINE of length LINE_WIDTH, determine the width
without any trailing whitespace. */
@@ -465,6 +578,31 @@ get_line_width_without_trailing_whitespace (const char *line, int line_width)
return result;
}
+#if CHECKING_P
+
+/* A helper function for testing get_line_width_without_trailing_whitespace. */
+
+static void
+assert_eq (const char *line, int expected_width)
+{
+ int actual_value
+ = get_line_width_without_trailing_whitespace (line, strlen (line));
+ ASSERT_EQ (actual_value, expected_width);
+}
+
+static void
+test_get_line_width_without_trailing_whitespace ()
+{
+ assert_eq ("", 0);
+ assert_eq (" ", 0);
+ assert_eq ("\t", 0);
+ assert_eq ("hello world", 11);
+ assert_eq ("hello world ", 11);
+ assert_eq ("hello world \t\t ", 11);
+}
+
+#endif /* #if CHECKING_P */
+
/* Helper function for layout's ctor, for sanitizing locations relative
to the primary location within a diagnostic.
@@ -1171,3 +1309,21 @@ diagnostic_show_locus (diagnostic_context * context,
pp_set_prefix (context->printer, saved_prefix);
}
+
+#if CHECKING_P
+
+namespace selftest {
+
+void
+diagnostic_show_locus_c_tests ()
+{
+ test_range_contains_point_for_single_point ();
+ test_range_contains_point_test_for_single_line ();
+ test_range_contains_point_for_multiple_lines ();
+
+ test_get_line_width_without_trailing_whitespace ();
+}
+
+} // namespace selftest
+
+#endif /* #if CHECKING_P */