[clang-tools-extra] [llvm] Clang doc test (PR #93928)

via cfe-commits cfe-commits at lists.llvm.org
Thu May 30 23:23:26 PDT 2024


https://github.com/PeterChou1 created https://github.com/llvm/llvm-project/pull/93928

issue: https://github.com/llvm/llvm-project/issues/93925

>From a4141043cb67a8396a82724f4d5d0ec3db0cdfe6 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Thu, 30 May 2024 22:22:02 -0400
Subject: [PATCH 1/3] [clang][clang-doc] add first basic e2e test

---
 0001-clang-doc-add-e2e-unit-test.patch        | 369 ++++++++++++++++++
 .../Inputs/clang-doc-project1/CMakeLists.txt  |  14 +
 .../Inputs/clang-doc-project1/Calculator.cpp  |  21 +
 .../Inputs/clang-doc-project1/Calculator.h    |  46 +++
 .../Inputs/clang-doc-project1/Circle.cpp      |  11 +
 .../Inputs/clang-doc-project1/Circle.h        |  35 ++
 .../Inputs/clang-doc-project1/Rectangle.cpp   |  12 +
 .../Inputs/clang-doc-project1/Rectangle.h     |  37 ++
 .../Inputs/clang-doc-project1/Shape.h         |  30 ++
 .../clang-doc-project1/database_template.json |  22 ++
 .../Inputs/clang-doc-project1/main.cpp        |  25 ++
 .../test/clang-doc/clang-doc-project1.cpp     |  11 +
 12 files changed, 633 insertions(+)
 create mode 100644 0001-clang-doc-add-e2e-unit-test.patch
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp

diff --git a/0001-clang-doc-add-e2e-unit-test.patch b/0001-clang-doc-add-e2e-unit-test.patch
new file mode 100644
index 0000000000000..1c8f20e51100b
--- /dev/null
+++ b/0001-clang-doc-add-e2e-unit-test.patch
@@ -0,0 +1,369 @@
+From 26dc42ff5f6f4fd4d2d0bea3dae785f70f835803 Mon Sep 17 00:00:00 2001
+From: PeterChou1 <peter.chou at mail.utoronto.ca>
+Date: Thu, 30 May 2024 21:55:27 -0400
+Subject: [PATCH] [clang-doc] add e2e unit test
+
+---
+ .../Inputs/clang-doc-project1/CMakeLists.txt  | 14 ++++++
+ .../Inputs/clang-doc-project1/Calculator.cpp  | 21 +++++++++
+ .../Inputs/clang-doc-project1/Calculator.h    | 46 +++++++++++++++++++
+ .../Inputs/clang-doc-project1/Circle.cpp      | 11 +++++
+ .../Inputs/clang-doc-project1/Circle.h        | 35 ++++++++++++++
+ .../Inputs/clang-doc-project1/Rectangle.cpp   | 12 +++++
+ .../Inputs/clang-doc-project1/Rectangle.h     | 37 +++++++++++++++
+ .../Inputs/clang-doc-project1/Shape.h         | 30 ++++++++++++
+ .../clang-doc-project1/database_template.json | 22 +++++++++
+ .../Inputs/clang-doc-project1/main.cpp        | 25 ++++++++++
+ .../test/clang-doc/clang-doc-project1.cpp     | 11 +++++
+ 11 files changed, 264 insertions(+)
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
+ create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
+ create mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
+
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
+new file mode 100644
+index 000000000000..a865714e04b1
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
+@@ -0,0 +1,14 @@
++project(clang_doc_project1)
++
++set(CMAKE_CXX_STANDARD 17)
++
++# Add the executable
++add_executable(ProjectClangDoc1
++        src/main.cpp
++        src/Calculator.cpp
++        src/Circle.cpp
++        src/Rectangle.cpp
++)
++
++# Include directories
++target_include_directories(ProjectClangDoc1 PUBLIC include)
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
+new file mode 100644
+index 000000000000..df1778c3b9d5
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
+@@ -0,0 +1,21 @@
++#include "Calculator.h"
++#include <stdexcept>
++
++int Calculator::add(int a, int b) {
++    return a + b;
++}
++
++int Calculator::subtract(int a, int b) {
++    return a - b;
++}
++
++int Calculator::multiply(int a, int b) {
++    return a * b;
++}
++
++double Calculator::divide(int a, int b) {
++    if (b == 0) {
++        throw std::invalid_argument("Division by zero");
++    }
++    return static_cast<double>(a) / b;
++}
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
+new file mode 100644
+index 000000000000..6811834bc015
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
+@@ -0,0 +1,46 @@
++#pragma once
++
++/**
++ * @brief A simple calculator class.
++ *
++ * Provides basic arithmetic operations.
++ */
++class Calculator {
++public:
++    /**
++     * @brief Adds two integers.
++     *
++     * @param a First integer.
++     * @param b Second integer.
++     * @return int The sum of a and b.
++     */
++    int add(int a, int b);
++
++    /**
++     * @brief Subtracts the second integer from the first.
++     *
++     * @param a First integer.
++     * @param b Second integer.
++     * @return int The result of a - b.
++     */
++    int subtract(int a, int b);
++
++    /**
++     * @brief Multiplies two integers.
++     *
++     * @param a First integer.
++     * @param b Second integer.
++     * @return int The product of a and b.
++     */
++    int multiply(int a, int b);
++
++    /**
++     * @brief Divides the first integer by the second.
++     *
++     * @param a First integer.
++     * @param b Second integer.
++     * @return double The result of a / b.
++     * @throw std::invalid_argument if b is zero.
++     */
++    double divide(int a, int b);
++};
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
+new file mode 100644
+index 000000000000..823384a4d97e
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
+@@ -0,0 +1,11 @@
++#include "Circle.h"
++
++Circle::Circle(double radius) : radius_(radius) {}
++
++double Circle::area() const {
++    return 3.141 * radius_ * radius_;
++}
++
++double Circle::perimeter() const {
++    return 3.141 * radius_;
++}
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
+new file mode 100644
+index 000000000000..7bee3ffa9253
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
+@@ -0,0 +1,35 @@
++#pragma once
++
++#include "Shape.h"
++
++/**
++ * @brief Circle class derived from Shape.
++ *
++ * Represents a circle with a given radius.
++ */
++class Circle : public Shape {
++public:
++    /**
++     * @brief Constructs a new Circle object.
++     *
++     * @param radius Radius of the circle.
++     */
++    Circle(double radius);
++
++    /**
++     * @brief Calculates the area of the circle.
++     *
++     * @return double The area of the circle.
++     */
++    double area() const override;
++
++    /**
++     * @brief Calculates the perimeter of the circle.
++     *
++     * @return double The perimeter of the circle.
++     */
++    double perimeter() const override;
++
++private:
++    double radius_; ///< Radius of the circle.
++};
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
+new file mode 100644
+index 000000000000..7ffc769157eb
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
+@@ -0,0 +1,12 @@
++#include "Rectangle.h"
++
++Rectangle::Rectangle(double width, double height)
++        : width_(width), height_(height) {}
++
++double Rectangle::area() const {
++    return width_ * height_;
++}
++
++double Rectangle::perimeter() const {
++    return 2 * (width_ + height_);
++}
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
+new file mode 100644
+index 000000000000..8c6223a4f618
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
+@@ -0,0 +1,37 @@
++#pragma once
++
++#include "Shape.h"
++
++/**
++ * @brief Rectangle class derived from Shape.
++ *
++ * Represents a rectangle with a given width and height.
++ */
++class Rectangle : public Shape {
++public:
++    /**
++     * @brief Constructs a new Rectangle object.
++     *
++     * @param width Width of the rectangle.
++     * @param height Height of the rectangle.
++     */
++    Rectangle(double width, double height);
++
++    /**
++     * @brief Calculates the area of the rectangle.
++     *
++     * @return double The area of the rectangle.
++     */
++    double area() const override;
++
++    /**
++     * @brief Calculates the perimeter of the rectangle.
++     *
++     * @return double The perimeter of the rectangle.
++     */
++    double perimeter() const override;
++
++private:
++    double width_; ///< Width of the rectangle.
++    double height_; ///< Height of the rectangle.
++};
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
+new file mode 100644
+index 000000000000..e5c5d4c9e441
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
+@@ -0,0 +1,30 @@
++#pragma once
++
++/**
++ * @brief Abstract base class for shapes.
++ *
++ * Provides a common interface for different types of shapes.
++ */
++class Shape {
++public:
++    /**
++     * @brief Virtual destructor.
++     */
++    virtual ~Shape() {}
++
++    /**
++     * @brief Calculates the area of the shape.
++     *
++     * @return double The area of the shape.
++     */
++    virtual double area() const = 0;
++
++    /**
++     * @brief Calculates the perimeter of the shape.
++     *
++     * @return double The perimeter of the shape.
++     */
++    virtual double perimeter() const = 0;
++};
++
++
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
+new file mode 100644
+index 000000000000..0549c5b718f0
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
+@@ -0,0 +1,22 @@
++[
++{
++  "directory": "$test_dir/build",
++  "command": "clang++ -o main.o -I../include $test_dir/src/main.cpp",
++  "file": "$test_dir/src/main.cpp"
++},
++{
++  "directory": "$test_dir/build",
++  "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp",
++  "file": "$test_dir/src/Calculator.cpp"
++},
++{
++  "directory": "$test_dir/build",
++  "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp",
++  "file": "$test_dir/src/Circle.cpp"
++},
++{
++  "directory": "$test_dir/build",
++  "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp",
++  "file": "$test_dir/src/Rectangle.cpp"
++}
++]
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
+new file mode 100644
+index 000000000000..e20732c7de37
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
+@@ -0,0 +1,25 @@
++#include <iostream>
++#include "Calculator.h"
++#include "Circle.h"
++#include "Rectangle.h"
++
++int main() {
++    // Calculator
++    Calculator calc;
++    std::cout << "Add: " << calc.add(3, 4) << std::endl;
++    std::cout << "Subtract: " << calc.subtract(10, 5) << std::endl;
++    std::cout << "Multiply: " << calc.multiply(2, 3) << std::endl;
++    std::cout << "Divide: " << calc.divide(10, 2) << std::endl;
++
++    // Circle
++    Circle circle(5.0);
++    std::cout << "Circle Area: " << circle.area() << std::endl;
++    std::cout << "Circle Perimeter: " << circle.perimeter() << std::endl;
++
++    // Rectangle
++    Rectangle rectangle(4.0, 6.0);
++    std::cout << "Rectangle Area: " << rectangle.area() << std::endl;
++    std::cout << "Rectangle Perimeter: " << rectangle.perimeter() << std::endl;
++
++    return 0;
++}
+\ No newline at end of file
+diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
+new file mode 100644
+index 000000000000..8c0289519854
+--- /dev/null
++++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
+@@ -0,0 +1,11 @@
++// RUN: mkdir -p %T/clang-doc/build
++// RUN: mkdir -p %T/clang-doc/include
++// RUN: mkdir -p %T/clang-doc/src
++// RUN: mkdir -p %T/clang-doc/docs
++// RUN: sed 's|$test_dir|%/T/clang-doc|g' %S/Inputs/clang-doc-project1/database_template.json > %T/clang-doc/build/compile_commands.json
++// RUN: cp %S/Inputs/clang-doc-project1/*.h  %T/clang-doc/include
++// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %T/clang-doc/src
++// RUN: cd %T/clang-doc/build
++// RUN: clang-doc --format=html --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json
++
++
+-- 
+2.36.1.windows.1
+
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
new file mode 100644
index 0000000000000..a865714e04b17
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
@@ -0,0 +1,14 @@
+project(clang_doc_project1)
+
+set(CMAKE_CXX_STANDARD 17)
+
+# Add the executable
+add_executable(ProjectClangDoc1
+        src/main.cpp
+        src/Calculator.cpp
+        src/Circle.cpp
+        src/Rectangle.cpp
+)
+
+# Include directories
+target_include_directories(ProjectClangDoc1 PUBLIC include)
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
new file mode 100644
index 0000000000000..df1778c3b9d55
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
@@ -0,0 +1,21 @@
+#include "Calculator.h"
+#include <stdexcept>
+
+int Calculator::add(int a, int b) {
+    return a + b;
+}
+
+int Calculator::subtract(int a, int b) {
+    return a - b;
+}
+
+int Calculator::multiply(int a, int b) {
+    return a * b;
+}
+
+double Calculator::divide(int a, int b) {
+    if (b == 0) {
+        throw std::invalid_argument("Division by zero");
+    }
+    return static_cast<double>(a) / b;
+}
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
new file mode 100644
index 0000000000000..6811834bc0159
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
@@ -0,0 +1,46 @@
+#pragma once
+
+/**
+ * @brief A simple calculator class.
+ *
+ * Provides basic arithmetic operations.
+ */
+class Calculator {
+public:
+    /**
+     * @brief Adds two integers.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The sum of a and b.
+     */
+    int add(int a, int b);
+
+    /**
+     * @brief Subtracts the second integer from the first.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The result of a - b.
+     */
+    int subtract(int a, int b);
+
+    /**
+     * @brief Multiplies two integers.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The product of a and b.
+     */
+    int multiply(int a, int b);
+
+    /**
+     * @brief Divides the first integer by the second.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return double The result of a / b.
+     * @throw std::invalid_argument if b is zero.
+     */
+    double divide(int a, int b);
+};
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
new file mode 100644
index 0000000000000..823384a4d97e8
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
@@ -0,0 +1,11 @@
+#include "Circle.h"
+
+Circle::Circle(double radius) : radius_(radius) {}
+
+double Circle::area() const {
+    return 3.141 * radius_ * radius_;
+}
+
+double Circle::perimeter() const {
+    return 3.141 * radius_;
+}
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
new file mode 100644
index 0000000000000..7bee3ffa92539
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "Shape.h"
+
+/**
+ * @brief Circle class derived from Shape.
+ *
+ * Represents a circle with a given radius.
+ */
+class Circle : public Shape {
+public:
+    /**
+     * @brief Constructs a new Circle object.
+     *
+     * @param radius Radius of the circle.
+     */
+    Circle(double radius);
+
+    /**
+     * @brief Calculates the area of the circle.
+     *
+     * @return double The area of the circle.
+     */
+    double area() const override;
+
+    /**
+     * @brief Calculates the perimeter of the circle.
+     *
+     * @return double The perimeter of the circle.
+     */
+    double perimeter() const override;
+
+private:
+    double radius_; ///< Radius of the circle.
+};
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
new file mode 100644
index 0000000000000..7ffc769157ebc
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
@@ -0,0 +1,12 @@
+#include "Rectangle.h"
+
+Rectangle::Rectangle(double width, double height)
+        : width_(width), height_(height) {}
+
+double Rectangle::area() const {
+    return width_ * height_;
+}
+
+double Rectangle::perimeter() const {
+    return 2 * (width_ + height_);
+}
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
new file mode 100644
index 0000000000000..8c6223a4f6180
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "Shape.h"
+
+/**
+ * @brief Rectangle class derived from Shape.
+ *
+ * Represents a rectangle with a given width and height.
+ */
+class Rectangle : public Shape {
+public:
+    /**
+     * @brief Constructs a new Rectangle object.
+     *
+     * @param width Width of the rectangle.
+     * @param height Height of the rectangle.
+     */
+    Rectangle(double width, double height);
+
+    /**
+     * @brief Calculates the area of the rectangle.
+     *
+     * @return double The area of the rectangle.
+     */
+    double area() const override;
+
+    /**
+     * @brief Calculates the perimeter of the rectangle.
+     *
+     * @return double The perimeter of the rectangle.
+     */
+    double perimeter() const override;
+
+private:
+    double width_; ///< Width of the rectangle.
+    double height_; ///< Height of the rectangle.
+};
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
new file mode 100644
index 0000000000000..e5c5d4c9e4412
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
@@ -0,0 +1,30 @@
+#pragma once
+
+/**
+ * @brief Abstract base class for shapes.
+ *
+ * Provides a common interface for different types of shapes.
+ */
+class Shape {
+public:
+    /**
+     * @brief Virtual destructor.
+     */
+    virtual ~Shape() {}
+
+    /**
+     * @brief Calculates the area of the shape.
+     *
+     * @return double The area of the shape.
+     */
+    virtual double area() const = 0;
+
+    /**
+     * @brief Calculates the perimeter of the shape.
+     *
+     * @return double The perimeter of the shape.
+     */
+    virtual double perimeter() const = 0;
+};
+
+
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
new file mode 100644
index 0000000000000..0549c5b718f08
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
@@ -0,0 +1,22 @@
+[
+{
+  "directory": "$test_dir/build",
+  "command": "clang++ -o main.o -I../include $test_dir/src/main.cpp",
+  "file": "$test_dir/src/main.cpp"
+},
+{
+  "directory": "$test_dir/build",
+  "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp",
+  "file": "$test_dir/src/Calculator.cpp"
+},
+{
+  "directory": "$test_dir/build",
+  "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp",
+  "file": "$test_dir/src/Circle.cpp"
+},
+{
+  "directory": "$test_dir/build",
+  "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp",
+  "file": "$test_dir/src/Rectangle.cpp"
+}
+]
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
new file mode 100644
index 0000000000000..e20732c7de371
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
@@ -0,0 +1,25 @@
+#include <iostream>
+#include "Calculator.h"
+#include "Circle.h"
+#include "Rectangle.h"
+
+int main() {
+    // Calculator
+    Calculator calc;
+    std::cout << "Add: " << calc.add(3, 4) << std::endl;
+    std::cout << "Subtract: " << calc.subtract(10, 5) << std::endl;
+    std::cout << "Multiply: " << calc.multiply(2, 3) << std::endl;
+    std::cout << "Divide: " << calc.divide(10, 2) << std::endl;
+
+    // Circle
+    Circle circle(5.0);
+    std::cout << "Circle Area: " << circle.area() << std::endl;
+    std::cout << "Circle Perimeter: " << circle.perimeter() << std::endl;
+
+    // Rectangle
+    Rectangle rectangle(4.0, 6.0);
+    std::cout << "Rectangle Area: " << rectangle.area() << std::endl;
+    std::cout << "Rectangle Perimeter: " << rectangle.perimeter() << std::endl;
+
+    return 0;
+}
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
new file mode 100644
index 0000000000000..8c0289519854d
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
@@ -0,0 +1,11 @@
+// RUN: mkdir -p %T/clang-doc/build
+// RUN: mkdir -p %T/clang-doc/include
+// RUN: mkdir -p %T/clang-doc/src
+// RUN: mkdir -p %T/clang-doc/docs
+// RUN: sed 's|$test_dir|%/T/clang-doc|g' %S/Inputs/clang-doc-project1/database_template.json > %T/clang-doc/build/compile_commands.json
+// RUN: cp %S/Inputs/clang-doc-project1/*.h  %T/clang-doc/include
+// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %T/clang-doc/src
+// RUN: cd %T/clang-doc/build
+// RUN: clang-doc --format=html --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json
+
+

>From 28ac8462c4b9a6c5e2e7d0da033149181fb519c3 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Fri, 31 May 2024 01:39:27 -0400
Subject: [PATCH 2/3] [clang][clang-doc] add unit file check

---
 .../Inputs/clang-doc-project1/CMakeLists.txt  |  14 -
 .../test/clang-doc/clang-doc-project1.cpp     | 361 +++++++++++++++++-
 2 files changed, 360 insertions(+), 15 deletions(-)
 delete mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt

diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
deleted file mode 100644
index a865714e04b17..0000000000000
--- a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-project(clang_doc_project1)
-
-set(CMAKE_CXX_STANDARD 17)
-
-# Add the executable
-add_executable(ProjectClangDoc1
-        src/main.cpp
-        src/Calculator.cpp
-        src/Circle.cpp
-        src/Rectangle.cpp
-)
-
-# Include directories
-target_include_directories(ProjectClangDoc1 PUBLIC include)
diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
index 8c0289519854d..c382396ea4cab 100644
--- a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
+++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
@@ -6,6 +6,365 @@
 // RUN: cp %S/Inputs/clang-doc-project1/*.h  %T/clang-doc/include
 // RUN: cp %S/Inputs/clang-doc-project1/*.cpp %T/clang-doc/src
 // RUN: cd %T/clang-doc/build
-// RUN: clang-doc --format=html --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json
+// RUN: clang-doc --format=html --repository=github.com --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json
+// RUN: FileCheck -input-file=%T/clang-doc/docs/index_json.js -check-prefix=CHECK-JSON-INDEX %s
+// RUN: FileCheck -input-file=%T/clang-doc/docs/GlobalNamespace/Shape.html -check-prefix=CHECK-HTML-SHAPE %s
+// RUN: FileCheck -input-file=%T/clang-doc/docs/GlobalNamespace/Calculator.html -check-prefix=CHECK-HTML-CALC %s
+// RUN: FileCheck -input-file=%T/clang-doc/docs/GlobalNamespace/Rectangle.html -check-prefix=CHECK-HTML-RECTANGLE %s
+// RUN: FileCheck -input-file=%T/clang-doc/docs/GlobalNamespace/Circle.html -check-prefix=CHECK-HTML-CIRCLE %s
+
+// CHECK-JSON-INDEX: var JsonIndex = `
+// CHECK-JSON-INDEX: {
+// CHECK-JSON-INDEX:   "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:   "Name": "",
+// CHECK-JSON-INDEX:   "RefType": "default",
+// CHECK-JSON-INDEX:   "Path": "",
+// CHECK-JSON-INDEX:   "Children": [
+// CHECK-JSON-INDEX:     {
+// CHECK-JSON-INDEX:       "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:       "Name": "GlobalNamespace",
+// CHECK-JSON-INDEX:       "RefType": "namespace",
+// CHECK-JSON-INDEX:       "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX:       "Children": [
+// CHECK-JSON-INDEX:         {
+// CHECK-JSON-INDEX:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:           "Name": "Calculator",
+// CHECK-JSON-INDEX:           "RefType": "record",
+// CHECK-JSON-INDEX:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX:           "Children": []
+// CHECK-JSON-INDEX:         },
+// CHECK-JSON-INDEX:         {
+// CHECK-JSON-INDEX:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:           "Name": "Circle",
+// CHECK-JSON-INDEX:           "RefType": "record",
+// CHECK-JSON-INDEX:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX:           "Children": []
+// CHECK-JSON-INDEX:         },
+// CHECK-JSON-INDEX:         {
+// CHECK-JSON-INDEX:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:           "Name": "Rectangle",
+// CHECK-JSON-INDEX:           "RefType": "record",
+// CHECK-JSON-INDEX:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX:           "Children": []
+// CHECK-JSON-INDEX:         },
+// CHECK-JSON-INDEX:         {
+// CHECK-JSON-INDEX:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX:           "Name": "Shape",
+// CHECK-JSON-INDEX:           "RefType": "record",
+// CHECK-JSON-INDEX:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX:           "Children": []
+// CHECK-JSON-INDEX:         }
+// CHECK-JSON-INDEX:       ]
+// CHECK-JSON-INDEX:     }
+// CHECK-JSON-INDEX:   ]
+// CHECK-JSON-INDEX: }`;
+
+// CHECK-HTML-SHAPE: <!DOCTYPE html>
+// CHECK-HTML-SHAPE: <meta charset="utf-8"/>
+// CHECK-HTML-SHAPE: <title>class Shape</title>
+// CHECK-HTML-SHAPE: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-SHAPE: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-SHAPE: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-SHAPE: <header id="project-title"></header>
+// CHECK-HTML-SHAPE: <main>
+// CHECK-HTML-SHAPE:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-SHAPE:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-SHAPE:     <h1>class Shape</h1>
+// CHECK-HTML-SHAPE:     <p>Defined at line 8 of file {{.*}}Shape.h</p>
+// CHECK-HTML-SHAPE:     <div>
+// CHECK-HTML-SHAPE:       <div>
+// CHECK-HTML-SHAPE:         <p> Provides a common interface for different types of shapes.</p>
+// CHECK-HTML-SHAPE:       </div>
+// CHECK-HTML-SHAPE:     </div>
+// CHECK-HTML-SHAPE:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-SHAPE:     <div>
+// CHECK-HTML-SHAPE:       <h3 id="{{([0-9A-F]{40})}}">~Shape</h3>
+// CHECK-HTML-SHAPE:       <p>public void ~Shape()</p>
+// CHECK-HTML-SHAPE:       <p>Defined at line 13 of file {{.*}}Shape.h</p>
+// CHECK-HTML-SHAPE:       <div>
+// CHECK-HTML-SHAPE:         <div></div>
+// CHECK-HTML-SHAPE:       </div>
+// CHECK-HTML-SHAPE:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-SHAPE:       <p>public double area()</p>
+// CHECK-HTML-SHAPE:       <div>
+// CHECK-HTML-SHAPE:         <div></div>
+// CHECK-HTML-SHAPE:       </div>
+// CHECK-HTML-SHAPE:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-SHAPE:       <p>public double perimeter()</p>
+// CHECK-HTML-SHAPE:       <div>
+// CHECK-HTML-SHAPE:         <div></div>
+// CHECK-HTML-SHAPE:       </div>
+// CHECK-HTML-SHAPE:     </div>
+// CHECK-HTML-SHAPE:   </div>
+// CHECK-HTML-SHAPE:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-SHAPE:     <ol>
+// CHECK-HTML-SHAPE:       <li>
+// CHECK-HTML-SHAPE:         <span>
+// CHECK-HTML-SHAPE:           <a href="#Functions">Functions</a>
+// CHECK-HTML-SHAPE:         </span>
+// CHECK-HTML-SHAPE:         <ul>
+// CHECK-HTML-SHAPE:           <li>
+// CHECK-HTML-SHAPE:             <span>
+// CHECK-HTML-SHAPE:               <a href="#{{([0-9A-F]{40})}}">~Shape</a>
+// CHECK-HTML-SHAPE:             </span>
+// CHECK-HTML-SHAPE:           </li>
+// CHECK-HTML-SHAPE:           <li>
+// CHECK-HTML-SHAPE:             <span>
+// CHECK-HTML-SHAPE:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-SHAPE:             </span>
+// CHECK-HTML-SHAPE:           </li>
+// CHECK-HTML-SHAPE:           <li>
+// CHECK-HTML-SHAPE:             <span>
+// CHECK-HTML-SHAPE:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-SHAPE:             </span>
+// CHECK-HTML-SHAPE:           </li>
+// CHECK-HTML-SHAPE:         </ul>
+// CHECK-HTML-SHAPE:       </li>
+// CHECK-HTML-SHAPE:     </ol>
+// CHECK-HTML-SHAPE:   </div>
+// CHECK-HTML-SHAPE: </main>
+
+// CHECK-HTML-CALC: <!DOCTYPE html>
+// CHECK-HTML-CALC: <meta charset="utf-8"/>
+// CHECK-HTML-CALC: <title>class Calculator</title>
+// CHECK-HTML-CALC: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-CALC: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-CALC: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-CALC: <header id="project-title"></header>
+// CHECK-HTML-CALC: <main>
+// CHECK-HTML-CALC:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-CALC:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-CALC:     <h1>class Calculator</h1>
+// CHECK-HTML-CALC:     <p>Defined at line 8 of file {{.*}}Calculator.h</p>
+// CHECK-HTML-CALC:     <div>
+// CHECK-HTML-CALC:       <div>
+// CHECK-HTML-CALC:         <p> Provides basic arithmetic operations.</p>
+// CHECK-HTML-CALC:       </div>
+// CHECK-HTML-CALC:     </div>
+// CHECK-HTML-CALC:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-CALC:     <div>
+// CHECK-HTML-CALC:       <h3 id="{{([0-9A-F]{40})}}">add</h3>
+// CHECK-HTML-CALC:       <p>public int add(int a, int b)</p>
+// CHECK-HTML-CALC:       <p>Defined at line 4 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC:       <div>
+// CHECK-HTML-CALC:         <div></div>
+// CHECK-HTML-CALC:       </div>
+// CHECK-HTML-CALC:       <h3 id="{{([0-9A-F]{40})}}">subtract</h3>
+// CHECK-HTML-CALC:       <p>public int subtract(int a, int b)</p>
+// CHECK-HTML-CALC:       <p>Defined at line 8 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC:       <div>
+// CHECK-HTML-CALC:         <div></div>
+// CHECK-HTML-CALC:       </div>
+// CHECK-HTML-CALC:       <h3 id="{{([0-9A-F]{40})}}">multiply</h3>
+// CHECK-HTML-CALC:       <p>public int multiply(int a, int b)</p>
+// CHECK-HTML-CALC:       <p>Defined at line 12 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC:       <div>
+// CHECK-HTML-CALC:         <div></div>
+// CHECK-HTML-CALC:       </div>
+// CHECK-HTML-CALC:       <h3 id="{{([0-9A-F]{40})}}">divide</h3>
+// CHECK-HTML-CALC:       <p>public double divide(int a, int b)</p>
+// CHECK-HTML-CALC:       <p>Defined at line 16 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC:       <div>
+// CHECK-HTML-CALC:         <div></div>
+// CHECK-HTML-CALC:       </div>
+// CHECK-HTML-CALC:     </div>
+// CHECK-HTML-CALC:   </div>
+// CHECK-HTML-CALC:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-CALC:     <ol>
+// CHECK-HTML-CALC:       <li>
+// CHECK-HTML-CALC:         <span>
+// CHECK-HTML-CALC:           <a href="#Functions">Functions</a>
+// CHECK-HTML-CALC:         </span>
+// CHECK-HTML-CALC:         <ul>
+// CHECK-HTML-CALC:           <li>
+// CHECK-HTML-CALC:             <span>
+// CHECK-HTML-CALC:               <a href="#{{([0-9A-F]{40})}}">add</a>
+// CHECK-HTML-CALC:             </span>
+// CHECK-HTML-CALC:           </li>
+// CHECK-HTML-CALC:           <li>
+// CHECK-HTML-CALC:             <span>
+// CHECK-HTML-CALC:               <a href="#{{([0-9A-F]{40})}}">subtract</a>
+// CHECK-HTML-CALC:             </span>
+// CHECK-HTML-CALC:           </li>
+// CHECK-HTML-CALC:           <li>
+// CHECK-HTML-CALC:             <span>
+// CHECK-HTML-CALC:               <a href="#{{([0-9A-F]{40})}}">multiply</a>
+// CHECK-HTML-CALC:             </span>
+// CHECK-HTML-CALC:           </li>
+// CHECK-HTML-CALC:           <li>
+// CHECK-HTML-CALC:             <span>
+// CHECK-HTML-CALC:               <a href="#{{([0-9A-F]{40})}}">divide</a>
+// CHECK-HTML-CALC:             </span>
+// CHECK-HTML-CALC:           </li>
+// CHECK-HTML-CALC:         </ul>
+// CHECK-HTML-CALC:       </li>
+// CHECK-HTML-CALC:     </ol>
+// CHECK-HTML-CALC:   </div>
+// CHECK-HTML-CALC: </main>
+
+// CHECK-HTML-RECTANGLE: <!DOCTYPE html>
+// CHECK-HTML-RECTANGLE: <meta charset="utf-8"/>
+// CHECK-HTML-RECTANGLE: <title>class Rectangle</title>
+// CHECK-HTML-RECTANGLE: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-RECTANGLE: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-RECTANGLE: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-RECTANGLE: <header id="project-title"></header>
+// CHECK-HTML-RECTANGLE: <main>
+// CHECK-HTML-RECTANGLE:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-RECTANGLE:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-RECTANGLE:     <h1>class Rectangle</h1>
+// CHECK-HTML-RECTANGLE:     <p>Defined at line 10 of file {{.*}}Rectangle.h</p>
+// CHECK-HTML-RECTANGLE:     <div>
+// CHECK-HTML-RECTANGLE:       <div>
+// CHECK-HTML-RECTANGLE:         <p> Represents a rectangle with a given width and height.</p>
+// CHECK-HTML-RECTANGLE:       </div>
+// CHECK-HTML-RECTANGLE:     </div>
+// CHECK-HTML-RECTANGLE:     <p>
+// CHECK-HTML-RECTANGLE:       Inherits from
+// CHECK-HTML-RECTANGLE:       <a href="Shape.html">Shape</a>
+// CHECK-HTML-RECTANGLE:     </p>
+// CHECK-HTML-RECTANGLE:     <h2 id="Members">Members</h2>
+// CHECK-HTML-RECTANGLE:     <ul>
+// CHECK-HTML-RECTANGLE:       <li>private double width_</li>
+// CHECK-HTML-RECTANGLE:       <li>private double height_</li>
+// CHECK-HTML-RECTANGLE:     </ul>
+// CHECK-HTML-RECTANGLE:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-RECTANGLE:     <div>
+// CHECK-HTML-RECTANGLE:       <h3 id="{{([0-9A-F]{40})}}">Rectangle</h3>
+// CHECK-HTML-RECTANGLE:       <p>public void Rectangle(double width, double height)</p>
+// CHECK-HTML-RECTANGLE:       <p>Defined at line 3 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE:       <div>
+// CHECK-HTML-RECTANGLE:         <div></div>
+// CHECK-HTML-RECTANGLE:       </div>
+// CHECK-HTML-RECTANGLE:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-RECTANGLE:       <p>public double area()</p>
+// CHECK-HTML-RECTANGLE:       <p>Defined at line 6 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE:       <div>
+// CHECK-HTML-RECTANGLE:         <div></div>
+// CHECK-HTML-RECTANGLE:       </div>
+// CHECK-HTML-RECTANGLE:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-RECTANGLE:       <p>public double perimeter()</p>
+// CHECK-HTML-RECTANGLE:       <p>Defined at line 10 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE:       <div>
+// CHECK-HTML-RECTANGLE:         <div></div>
+// CHECK-HTML-RECTANGLE:       </div>
+// CHECK-HTML-RECTANGLE:     </div>
+// CHECK-HTML-RECTANGLE:   </div>
+// CHECK-HTML-RECTANGLE:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-RECTANGLE:     <ol>
+// CHECK-HTML-RECTANGLE:       <li>
+// CHECK-HTML-RECTANGLE:         <span>
+// CHECK-HTML-RECTANGLE:           <a href="#Members">Members</a>
+// CHECK-HTML-RECTANGLE:         </span>
+// CHECK-HTML-RECTANGLE:       </li>
+// CHECK-HTML-RECTANGLE:       <li>
+// CHECK-HTML-RECTANGLE:         <span>
+// CHECK-HTML-RECTANGLE:           <a href="#Functions">Functions</a>
+// CHECK-HTML-RECTANGLE:         </span>
+// CHECK-HTML-RECTANGLE:         <ul>
+// CHECK-HTML-RECTANGLE:           <li>
+// CHECK-HTML-RECTANGLE:             <span>
+// CHECK-HTML-RECTANGLE:               <a href="#{{([0-9A-F]{40})}}">Rectangle</a>
+// CHECK-HTML-RECTANGLE:             </span>
+// CHECK-HTML-RECTANGLE:           </li>
+// CHECK-HTML-RECTANGLE:           <li>
+// CHECK-HTML-RECTANGLE:             <span>
+// CHECK-HTML-RECTANGLE:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-RECTANGLE:             </span>
+// CHECK-HTML-RECTANGLE:           </li>
+// CHECK-HTML-RECTANGLE:           <li>
+// CHECK-HTML-RECTANGLE:             <span>
+// CHECK-HTML-RECTANGLE:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-RECTANGLE:             </span>
+// CHECK-HTML-RECTANGLE:           </li>
+// CHECK-HTML-RECTANGLE:         </ul>
+// CHECK-HTML-RECTANGLE:       </li>
+// CHECK-HTML-RECTANGLE:     </ol>
+// CHECK-HTML-RECTANGLE:   </div>
+// CHECK-HTML-RECTANGLE: </main>
+
+// CHECK-HTML-CIRCLE: <!DOCTYPE html>
+// CHECK-HTML-CIRCLE: <meta charset="utf-8"/>
+// CHECK-HTML-CIRCLE: <title>class Circle</title>
+// CHECK-HTML-CIRCLE: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-CIRCLE: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-CIRCLE: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-CIRCLE: <header id="project-title"></header>
+// CHECK-HTML-CIRCLE: <main>
+// CHECK-HTML-CIRCLE:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-CIRCLE:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-CIRCLE:     <h1>class Circle</h1>
+// CHECK-HTML-CIRCLE:     <p>Defined at line 10 of file {{.*}}Circle.h</p>
+// CHECK-HTML-CIRCLE:     <div>
+// CHECK-HTML-CIRCLE:       <div>
+// CHECK-HTML-CIRCLE:         <p> Represents a circle with a given radius.</p>
+// CHECK-HTML-CIRCLE:       </div>
+// CHECK-HTML-CIRCLE:     </div>
+// CHECK-HTML-CIRCLE:     <p>
+// CHECK-HTML-CIRCLE:       Inherits from
+// CHECK-HTML-CIRCLE:       <a href="Shape.html">Shape</a>
+// CHECK-HTML-CIRCLE:     </p>
+// CHECK-HTML-CIRCLE:     <h2 id="Members">Members</h2>
+// CHECK-HTML-CIRCLE:     <ul>
+// CHECK-HTML-CIRCLE:       <li>private double radius_</li>
+// CHECK-HTML-CIRCLE:     </ul>
+// CHECK-HTML-CIRCLE:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-CIRCLE:     <div>
+// CHECK-HTML-CIRCLE:       <h3 id="{{([0-9A-F]{40})}}">Circle</h3>
+// CHECK-HTML-CIRCLE:       <p>public void Circle(double radius)</p>
+// CHECK-HTML-CIRCLE:       <p>Defined at line 3 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE:       <div>
+// CHECK-HTML-CIRCLE:         <div></div>
+// CHECK-HTML-CIRCLE:       </div>
+// CHECK-HTML-CIRCLE:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-CIRCLE:       <p>public double area()</p>
+// CHECK-HTML-CIRCLE:       <p>Defined at line 5 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE:       <div>
+// CHECK-HTML-CIRCLE:         <div></div>
+// CHECK-HTML-CIRCLE:       </div>
+// CHECK-HTML-CIRCLE:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-CIRCLE:       <p>public double perimeter()</p>
+// CHECK-HTML-CIRCLE:       <p>Defined at line 9 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE:       <div>
+// CHECK-HTML-CIRCLE:         <div></div>
+// CHECK-HTML-CIRCLE:       </div>
+// CHECK-HTML-CIRCLE:     </div>
+// CHECK-HTML-CIRCLE:   </div>
+// CHECK-HTML-CIRCLE:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-CIRCLE:     <ol>
+// CHECK-HTML-CIRCLE:       <li>
+// CHECK-HTML-CIRCLE:         <span>
+// CHECK-HTML-CIRCLE:           <a href="#Members">Members</a>
+// CHECK-HTML-CIRCLE:         </span>
+// CHECK-HTML-CIRCLE:       </li>
+// CHECK-HTML-CIRCLE:       <li>
+// CHECK-HTML-CIRCLE:         <span>
+// CHECK-HTML-CIRCLE:           <a href="#Functions">Functions</a>
+// CHECK-HTML-CIRCLE:         </span>
+// CHECK-HTML-CIRCLE:         <ul>
+// CHECK-HTML-CIRCLE:           <li>
+// CHECK-HTML-CIRCLE:             <span>
+// CHECK-HTML-CIRCLE:               <a href="#{{([0-9A-F]{40})}}">Circle</a>
+// CHECK-HTML-CIRCLE:             </span>
+// CHECK-HTML-CIRCLE:           </li>
+// CHECK-HTML-CIRCLE:           <li>
+// CHECK-HTML-CIRCLE:             <span>
+// CHECK-HTML-CIRCLE:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-CIRCLE:             </span>
+// CHECK-HTML-CIRCLE:           </li>
+// CHECK-HTML-CIRCLE:           <li>
+// CHECK-HTML-CIRCLE:             <span>
+// CHECK-HTML-CIRCLE:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-CIRCLE:             </span>
+// CHECK-HTML-CIRCLE:           </li>
+// CHECK-HTML-CIRCLE:         </ul>
+// CHECK-HTML-CIRCLE:       </li>
+// CHECK-HTML-CIRCLE:     </ol>
+// CHECK-HTML-CIRCLE:   </div>
+// CHECK-HTML-CIRCLE: </main>
+
+
+
+
 
 

>From 408e85354e95f2e16e2b3bd703365db3c7beef30 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Fri, 31 May 2024 01:43:09 -0400
Subject: [PATCH 3/3] [clang][clang-doc] delete patch

---
 0001-clang-doc-add-e2e-unit-test.patch | 369 -------------------------
 1 file changed, 369 deletions(-)
 delete mode 100644 0001-clang-doc-add-e2e-unit-test.patch

diff --git a/0001-clang-doc-add-e2e-unit-test.patch b/0001-clang-doc-add-e2e-unit-test.patch
deleted file mode 100644
index 1c8f20e51100b..0000000000000
--- a/0001-clang-doc-add-e2e-unit-test.patch
+++ /dev/null
@@ -1,369 +0,0 @@
-From 26dc42ff5f6f4fd4d2d0bea3dae785f70f835803 Mon Sep 17 00:00:00 2001
-From: PeterChou1 <peter.chou at mail.utoronto.ca>
-Date: Thu, 30 May 2024 21:55:27 -0400
-Subject: [PATCH] [clang-doc] add e2e unit test
-
----
- .../Inputs/clang-doc-project1/CMakeLists.txt  | 14 ++++++
- .../Inputs/clang-doc-project1/Calculator.cpp  | 21 +++++++++
- .../Inputs/clang-doc-project1/Calculator.h    | 46 +++++++++++++++++++
- .../Inputs/clang-doc-project1/Circle.cpp      | 11 +++++
- .../Inputs/clang-doc-project1/Circle.h        | 35 ++++++++++++++
- .../Inputs/clang-doc-project1/Rectangle.cpp   | 12 +++++
- .../Inputs/clang-doc-project1/Rectangle.h     | 37 +++++++++++++++
- .../Inputs/clang-doc-project1/Shape.h         | 30 ++++++++++++
- .../clang-doc-project1/database_template.json | 22 +++++++++
- .../Inputs/clang-doc-project1/main.cpp        | 25 ++++++++++
- .../test/clang-doc/clang-doc-project1.cpp     | 11 +++++
- 11 files changed, 264 insertions(+)
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
- create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
- create mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
-
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
-new file mode 100644
-index 000000000000..a865714e04b1
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt
-@@ -0,0 +1,14 @@
-+project(clang_doc_project1)
-+
-+set(CMAKE_CXX_STANDARD 17)
-+
-+# Add the executable
-+add_executable(ProjectClangDoc1
-+        src/main.cpp
-+        src/Calculator.cpp
-+        src/Circle.cpp
-+        src/Rectangle.cpp
-+)
-+
-+# Include directories
-+target_include_directories(ProjectClangDoc1 PUBLIC include)
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
-new file mode 100644
-index 000000000000..df1778c3b9d5
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
-@@ -0,0 +1,21 @@
-+#include "Calculator.h"
-+#include <stdexcept>
-+
-+int Calculator::add(int a, int b) {
-+    return a + b;
-+}
-+
-+int Calculator::subtract(int a, int b) {
-+    return a - b;
-+}
-+
-+int Calculator::multiply(int a, int b) {
-+    return a * b;
-+}
-+
-+double Calculator::divide(int a, int b) {
-+    if (b == 0) {
-+        throw std::invalid_argument("Division by zero");
-+    }
-+    return static_cast<double>(a) / b;
-+}
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
-new file mode 100644
-index 000000000000..6811834bc015
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
-@@ -0,0 +1,46 @@
-+#pragma once
-+
-+/**
-+ * @brief A simple calculator class.
-+ *
-+ * Provides basic arithmetic operations.
-+ */
-+class Calculator {
-+public:
-+    /**
-+     * @brief Adds two integers.
-+     *
-+     * @param a First integer.
-+     * @param b Second integer.
-+     * @return int The sum of a and b.
-+     */
-+    int add(int a, int b);
-+
-+    /**
-+     * @brief Subtracts the second integer from the first.
-+     *
-+     * @param a First integer.
-+     * @param b Second integer.
-+     * @return int The result of a - b.
-+     */
-+    int subtract(int a, int b);
-+
-+    /**
-+     * @brief Multiplies two integers.
-+     *
-+     * @param a First integer.
-+     * @param b Second integer.
-+     * @return int The product of a and b.
-+     */
-+    int multiply(int a, int b);
-+
-+    /**
-+     * @brief Divides the first integer by the second.
-+     *
-+     * @param a First integer.
-+     * @param b Second integer.
-+     * @return double The result of a / b.
-+     * @throw std::invalid_argument if b is zero.
-+     */
-+    double divide(int a, int b);
-+};
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
-new file mode 100644
-index 000000000000..823384a4d97e
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
-@@ -0,0 +1,11 @@
-+#include "Circle.h"
-+
-+Circle::Circle(double radius) : radius_(radius) {}
-+
-+double Circle::area() const {
-+    return 3.141 * radius_ * radius_;
-+}
-+
-+double Circle::perimeter() const {
-+    return 3.141 * radius_;
-+}
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
-new file mode 100644
-index 000000000000..7bee3ffa9253
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
-@@ -0,0 +1,35 @@
-+#pragma once
-+
-+#include "Shape.h"
-+
-+/**
-+ * @brief Circle class derived from Shape.
-+ *
-+ * Represents a circle with a given radius.
-+ */
-+class Circle : public Shape {
-+public:
-+    /**
-+     * @brief Constructs a new Circle object.
-+     *
-+     * @param radius Radius of the circle.
-+     */
-+    Circle(double radius);
-+
-+    /**
-+     * @brief Calculates the area of the circle.
-+     *
-+     * @return double The area of the circle.
-+     */
-+    double area() const override;
-+
-+    /**
-+     * @brief Calculates the perimeter of the circle.
-+     *
-+     * @return double The perimeter of the circle.
-+     */
-+    double perimeter() const override;
-+
-+private:
-+    double radius_; ///< Radius of the circle.
-+};
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
-new file mode 100644
-index 000000000000..7ffc769157eb
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
-@@ -0,0 +1,12 @@
-+#include "Rectangle.h"
-+
-+Rectangle::Rectangle(double width, double height)
-+        : width_(width), height_(height) {}
-+
-+double Rectangle::area() const {
-+    return width_ * height_;
-+}
-+
-+double Rectangle::perimeter() const {
-+    return 2 * (width_ + height_);
-+}
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
-new file mode 100644
-index 000000000000..8c6223a4f618
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
-@@ -0,0 +1,37 @@
-+#pragma once
-+
-+#include "Shape.h"
-+
-+/**
-+ * @brief Rectangle class derived from Shape.
-+ *
-+ * Represents a rectangle with a given width and height.
-+ */
-+class Rectangle : public Shape {
-+public:
-+    /**
-+     * @brief Constructs a new Rectangle object.
-+     *
-+     * @param width Width of the rectangle.
-+     * @param height Height of the rectangle.
-+     */
-+    Rectangle(double width, double height);
-+
-+    /**
-+     * @brief Calculates the area of the rectangle.
-+     *
-+     * @return double The area of the rectangle.
-+     */
-+    double area() const override;
-+
-+    /**
-+     * @brief Calculates the perimeter of the rectangle.
-+     *
-+     * @return double The perimeter of the rectangle.
-+     */
-+    double perimeter() const override;
-+
-+private:
-+    double width_; ///< Width of the rectangle.
-+    double height_; ///< Height of the rectangle.
-+};
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
-new file mode 100644
-index 000000000000..e5c5d4c9e441
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
-@@ -0,0 +1,30 @@
-+#pragma once
-+
-+/**
-+ * @brief Abstract base class for shapes.
-+ *
-+ * Provides a common interface for different types of shapes.
-+ */
-+class Shape {
-+public:
-+    /**
-+     * @brief Virtual destructor.
-+     */
-+    virtual ~Shape() {}
-+
-+    /**
-+     * @brief Calculates the area of the shape.
-+     *
-+     * @return double The area of the shape.
-+     */
-+    virtual double area() const = 0;
-+
-+    /**
-+     * @brief Calculates the perimeter of the shape.
-+     *
-+     * @return double The perimeter of the shape.
-+     */
-+    virtual double perimeter() const = 0;
-+};
-+
-+
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
-new file mode 100644
-index 000000000000..0549c5b718f0
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
-@@ -0,0 +1,22 @@
-+[
-+{
-+  "directory": "$test_dir/build",
-+  "command": "clang++ -o main.o -I../include $test_dir/src/main.cpp",
-+  "file": "$test_dir/src/main.cpp"
-+},
-+{
-+  "directory": "$test_dir/build",
-+  "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp",
-+  "file": "$test_dir/src/Calculator.cpp"
-+},
-+{
-+  "directory": "$test_dir/build",
-+  "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp",
-+  "file": "$test_dir/src/Circle.cpp"
-+},
-+{
-+  "directory": "$test_dir/build",
-+  "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp",
-+  "file": "$test_dir/src/Rectangle.cpp"
-+}
-+]
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
-new file mode 100644
-index 000000000000..e20732c7de37
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp
-@@ -0,0 +1,25 @@
-+#include <iostream>
-+#include "Calculator.h"
-+#include "Circle.h"
-+#include "Rectangle.h"
-+
-+int main() {
-+    // Calculator
-+    Calculator calc;
-+    std::cout << "Add: " << calc.add(3, 4) << std::endl;
-+    std::cout << "Subtract: " << calc.subtract(10, 5) << std::endl;
-+    std::cout << "Multiply: " << calc.multiply(2, 3) << std::endl;
-+    std::cout << "Divide: " << calc.divide(10, 2) << std::endl;
-+
-+    // Circle
-+    Circle circle(5.0);
-+    std::cout << "Circle Area: " << circle.area() << std::endl;
-+    std::cout << "Circle Perimeter: " << circle.perimeter() << std::endl;
-+
-+    // Rectangle
-+    Rectangle rectangle(4.0, 6.0);
-+    std::cout << "Rectangle Area: " << rectangle.area() << std::endl;
-+    std::cout << "Rectangle Perimeter: " << rectangle.perimeter() << std::endl;
-+
-+    return 0;
-+}
-\ No newline at end of file
-diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
-new file mode 100644
-index 000000000000..8c0289519854
---- /dev/null
-+++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
-@@ -0,0 +1,11 @@
-+// RUN: mkdir -p %T/clang-doc/build
-+// RUN: mkdir -p %T/clang-doc/include
-+// RUN: mkdir -p %T/clang-doc/src
-+// RUN: mkdir -p %T/clang-doc/docs
-+// RUN: sed 's|$test_dir|%/T/clang-doc|g' %S/Inputs/clang-doc-project1/database_template.json > %T/clang-doc/build/compile_commands.json
-+// RUN: cp %S/Inputs/clang-doc-project1/*.h  %T/clang-doc/include
-+// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %T/clang-doc/src
-+// RUN: cd %T/clang-doc/build
-+// RUN: clang-doc --format=html --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json
-+
-+
--- 
-2.36.1.windows.1
-



More information about the cfe-commits mailing list