/
wmigor
/
z-plane
Обзор
Документация
Войти
/
wmigor
/
z-plane
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/WingSectionTest.cpp
219 строк
5 KB
wmigor
Airfoil сделан через shared_ptr
08 июн 2026, 23:13
Верифицирован
08 июн 2026, 23:13
46dca30
Код
Авторство
О чём код?
#include <doctest/doctest.h> #include <asim/WingSection.h> #include <asim/Constants.h> TEST_CASE("Validation") { asim::WingSection section(std::make_shared<asim::Airfoil>()); SUBCASE("NULL Airfoil") { section.airfoil = NULL; CHECK_FALSE(section.isValid()); } SUBCASE("negative span") { section.span = -1; CHECK_FALSE(section.isValid()); } SUBCASE("negative chord") { section.chord = -1; CHECK_FALSE(section.isValid()); } SUBCASE("zero span") { section.span = 0.0; CHECK_FALSE(section.isValid()); } SUBCASE("zero chord") { section.chord = 0.0; CHECK_FALSE(section.isValid()); } SUBCASE("negative taper") { section.taper = -1; CHECK_FALSE(section.isValid()); } SUBCASE("dihedral is to big (mirror)") { section.dihedral = glm::radians(75.0); section.mirror = true; CHECK_FALSE(section.isValid()); } SUBCASE("dihedral is to low (mirror)") { section.dihedral = glm::radians(-75.0); section.mirror = true; CHECK_FALSE(section.isValid()); } SUBCASE("any dihedral (not mirror)") { section.dihedral = glm::radians(90.0); section.mirror = false; CHECK(section.isValid()); section.dihedral = glm::radians(-90.0); CHECK(section.isValid()); } SUBCASE("sweep is to big") { section.sweep = glm::radians(75.0); CHECK_FALSE(section.isValid()); } SUBCASE("sweep is to low") { section.sweep = glm::radians(-75.0); CHECK_FALSE(section.isValid()); } SUBCASE("invalid control surface") { asim::ControlSurface surface; surface.fraction = 0.0; section.controlSurfaces.push_back(surface); CHECK_FALSE(surface.isValid()); CHECK_FALSE(section.isValid()); } SUBCASE("init valid") { CHECK(section.isValid()); } } TEST_CASE("Wing section init") { asim::WingSection section(std::make_shared<asim::Airfoil>()); CHECK_EQ(4.0, section.span); CHECK_EQ(0.5, section.chord); CHECK_EQ(1.0, section.taper); CHECK_EQ(0.0, section.sweep); CHECK_EQ(0.0, section.dihedral); CHECK_EQ(0.0, section.incidence); CHECK_EQ(0.0, section.twist); CHECK_EQ(1.0, section.twistPower); CHECK_EQ(glm::dvec3(0.0), section.position); } TEST_CASE("Wing rect") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.span = 4.0; section.chord = 3.0; section.taper = 1.0; SUBCASE("Span area") CHECK_EQ(12.0, section.getSpanArea()); SUBCASE("MAC") CHECK_EQ(3.0, section.getMeanChord()); SUBCASE("MAC forward") CHECK_EQ(0.0, section.getMeanChordForwardPosition()); SUBCASE("MAC forward") CHECK_EQ(2.0, section.getMeanChordRightPosition()); SUBCASE("Get chord") { CHECK_EQ(3.0, section.getChord(0.0)); CHECK_EQ(3.0, section.getChord(0.5)); CHECK_EQ(3.0, section.getChord(1.0)); } } TEST_CASE("Wing taper") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.span = 4.0; section.chord = 3.0; section.taper = 0.0; SUBCASE("Span area") CHECK_EQ(6.0, section.getSpanArea()); SUBCASE("MAC") CHECK_EQ(2.0, section.getMeanChord()); SUBCASE("MAC forward") CHECK_EQ(0.0, section.getMeanChordForwardPosition()); SUBCASE("MAC forward") CHECK_EQ(1.0 + 1.0 / 3.0, section.getMeanChordRightPosition()); SUBCASE("Get chord") { CHECK_EQ(3.0, section.getChord(0.0)); CHECK_EQ(1.5, section.getChord(0.5)); CHECK_EQ(0.0, section.getChord(1.0)); } } TEST_CASE("Wing twist") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.twist = 2.0; CHECK_EQ(0.0, section.getTwist(0.0)); CHECK_EQ(1.0, section.getTwist(0.5)); CHECK_EQ(2.0, section.getTwist(1.0)); } TEST_CASE("Wing position") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.span = 4.0; section.dihedral = glm::radians(30.0); section.sweep = glm::radians(60.0); section.position = glm::dvec3(0.0); CHECK_EQ(4.0, glm::dot(section.getPosition(1.0), asim::Constants::Right)); CHECK_GT(0.0, glm::dot(section.getPosition(1.0), asim::Constants::Forward)); CHECK_LT(0.0, glm::dot(section.getPosition(1.0), asim::Constants::Up)); } TEST_CASE("AspectRatio") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.span = 4.0; section.chord = 1.0; SUBCASE("mirror") { section.mirror = true; CHECK_EQ(8.0, section.getAspectRatio()); } SUBCASE("single") { section.mirror = false; CHECK_EQ(4.0, section.getAspectRatio()); } } TEST_CASE("all") { asim::WingSection section(std::make_shared<asim::Airfoil>()); section.span = 4.0; section.chord = 1.0; section.taper = 0.5; section.dihedral = glm::radians(5.0); section.sweep = glm::radians(15.0); section.incidence = glm::radians(3.0); CHECK_EQ(0.77778, doctest::Approx(section.getMeanChord())); CHECK_EQ(-0.47635, doctest::Approx(section.getMeanChordForwardPosition())); CHECK_EQ(1.77778, doctest::Approx(section.getMeanChordRightPosition())); CHECK_EQ(10.6666, doctest::Approx(section.getAspectRatio())); }