// SPDX-FileCopyrightText: 2026 Progmasoft // SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1 import type { Metadata } from "next"; import { Footer } from "@/components/Footer"; import { SiteHeader } from "@/components/SiteHeader"; import { getLocale } from "@/lib/locale.server"; import { products } from "@/lib/products"; import { getSitesMessages } from "@/lib/product-sites"; export async function generateMetadata(): Promise { const { catch3 } = getSitesMessages(await getLocale()); return { title: `Catch3 ยท ${catch3.tagline}`, description: catch3.description, alternates: { canonical: "https://catch3.progmasoft.com/" }, }; } // The example of the Catch3 documentation (docs/progmasoft-properties.md). const example = `#include using namespace Progmasoft::Catch3; TEST_CASE( "reversing twice gives the original", "[property]" ) { CATCH3_CHECK_FOR_ALL( Gen::Vectors( Gen::Integers() ), []( const std::vector& values ) { auto copy = values; std::reverse( copy.begin(), copy.end() ); std::reverse( copy.begin(), copy.end() ); return copy == values; } ); }`; /** catch3.progmasoft.com: the site of Catch3. */ export default async function Catch3Page() { const locale = await getLocale(); const { catch3, common } = getSitesMessages(locale); return (

{catch3.eyebrow}

Catch3 {catch3.tagline}

{catch3.description}

{catch3.disclaimer}

{catch3.exampleTitle}

                {example}
              

{catch3.featuresTitle}

{catch3.features.map(([title, description]) => (

{title}

{description}

))}

{catch3.roadmapTitle}

    {catch3.roadmap.map((item) => (
  • {item}
  • ))}
); }