From 459a85409b751533d1a67ca9fb27510a7a58e073 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 27 Dec 2019 11:03:51 +0000 Subject: [PATCH] Add first good tests, can be automated if needed --- .gitignore | 1 + Makefile | 4 + source/tests/Makefile | 129 +++++++++++++++++++ source/tests/ansi-pedantic-test.c | 184 ++++++++++++++++++++++++++++ source/tests/ansi-pedantic-test.cpp | 1 + 5 files changed, 319 insertions(+) create mode 100644 source/tests/Makefile create mode 100644 source/tests/ansi-pedantic-test.c create mode 120000 source/tests/ansi-pedantic-test.cpp diff --git a/.gitignore b/.gitignore index 237042482..471c41a30 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ *.vst3 # Binary dir +bin/ansi-pedantic-test_* bin/carla bin/carla.lv2/carla-bridge-* bin/carla-database diff --git a/Makefile b/Makefile index 5fda3002a..ef022be81 100644 --- a/Makefile +++ b/Makefile @@ -371,6 +371,7 @@ clean: $(MAKE) clean -C source/modules $(MAKE) clean -C source/native-plugins $(MAKE) clean -C source/plugin + $(MAKE) clean -C source/tests $(MAKE) clean -C source/theme rm -f *~ source/*~ @@ -387,6 +388,9 @@ debug: doxygen: $(MAKE) doxygen -C source/backend +tests: + $(MAKE) -C source/tests + stoat: stoat --recursive ./build/ --suppression ./data/stoat-supression.txt --whitelist ./data/stoat-whitelist.txt --graph-view ./data/stoat-callgraph.png diff --git a/source/tests/Makefile b/source/tests/Makefile new file mode 100644 index 000000000..678710a31 --- /dev/null +++ b/source/tests/Makefile @@ -0,0 +1,129 @@ +#!/usr/bin/make -f +# Makefile for tests # +# ------------------ # +# Created by falkTX +# + +CWD=.. +include $(CWD)/Makefile.mk + +# --------------------------------------------------------------------------------------------------------------------- + +BINDIR := $(CWD)/../bin + +ifeq ($(DEBUG),true) +OBJDIR := $(CWD)/../build/tests/Debug +MODULEDIR := $(CWD)/../build/modules/Debug +else +OBJDIR := $(CWD)/../build/tests/Release +MODULEDIR := $(CWD)/../build/modules/Release +endif + +# --------------------------------------------------------------------------------------------------------------------- + +BUILD_C_FLAGS += -I.. +BUILD_CXX_FLAGS += -I.. -I$(CWD)/modules + +# --------------------------------------------------------------------------------------------------------------------- + +PEDANTIC_FLAGS = -pedantic -pedantic-errors +PEDANTIC_FLAGS += -Wall -Wextra -Werror -pipe -DBUILDING_CARLA -DREAL_BUILD +PEDANTIC_FLAGS += -I. -I../backend -I../includes -I../modules -I../utils + +PEDANTIC_FLAGS += -Wabi=98 -Wcast-qual -Wclobbered -Wconversion -Wdisabled-optimization +PEDANTIC_FLAGS += -Wcast-align -Wcast-qual -Wclobbered -Wconversion -Wdisabled-optimization +PEDANTIC_FLAGS += -Wdouble-promotion -Wfloat-equal -Wlogical-op -Wpointer-arith -Wsign-conversion +PEDANTIC_FLAGS += -Wformat=2 -Woverlength-strings +PEDANTIC_FLAGS += -Wformat-truncation=2 -Wformat-overflow=2 +PEDANTIC_FLAGS += -Wstringop-overflow=4 -Wstringop-truncation +PEDANTIC_FLAGS += -Wmissing-declarations -Wredundant-decls +PEDANTIC_FLAGS += -Wshadow -Wundef -Wuninitialized -Wunused +PEDANTIC_FLAGS += -Wstrict-aliasing -fstrict-aliasing +PEDANTIC_FLAGS += -Wstrict-overflow -fstrict-overflow +PEDANTIC_FLAGS += -Wduplicated-branches -Wduplicated-cond -Wnull-dereference + +PEDANTIC_CFLAGS = $(PEDANTIC_FLAGS) +PEDANTIC_CFLAGS += -Wc++-compat +PEDANTIC_CFLAGS += -Winit-self -Wjump-misses-init -Wnested-externs -Wwrite-strings +PEDANTIC_CFLAGS += -Wmissing-prototypes -Wstrict-prototypes + +PEDANTIC_CXXFLAGS = $(PEDANTIC_FLAGS) +PEDANTIC_CXXFLAGS += -Wc++0x-compat -Wc++11-compat +PEDANTIC_CXXFLAGS += -Wnon-virtual-dtor -Woverloaded-virtual +PEDANTIC_CXXFLAGS += -Wold-style-cast -Wuseless-cast +PEDANTIC_CXXFLAGS += -Wzero-as-null-pointer-constant +PEDANTIC_CXXFLAGS += -Weffc++ + +PEDANTIC_LDFLAGS = -Wl,-rpath,$(BINDIR) -L$(BINDIR) + +# --------------------------------------------------------------------------------------------------------------------- +# Set targets + +TARGETS = \ + ansi-pedantic-test_c_ansi_run \ + ansi-pedantic-test_c89_run \ + ansi-pedantic-test_c99_run \ + ansi-pedantic-test_c11_run \ + ansi-pedantic-test_cxx_ansi_run \ + ansi-pedantic-test_cxx98_run \ + ansi-pedantic-test_cxx03_run \ + ansi-pedantic-test_cxx11_run + +# --------------------------------------------------------------------------------------------------------------------- + +all: $(TARGETS) + +# --------------------------------------------------------------------------------------------------------------------- + +%_run: $(BINDIR)/% + $(BINDIR)/$* + +# --------------------------------------------------------------------------------------------------------------------- + +$(BINDIR)/ansi-pedantic-test_c_ansi: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h + $(CC) $< $(PEDANTIC_CFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -ansi -o $@ + +$(BINDIR)/ansi-pedantic-test_c89: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h + $(CC) $< $(PEDANTIC_CFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c89 -o $@ + +$(BINDIR)/ansi-pedantic-test_c99: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h + $(CC) $< $(PEDANTIC_CFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c99 -o $@ + +$(BINDIR)/ansi-pedantic-test_c11: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h + $(CC) $< $(PEDANTIC_CFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c11 -o $@ + +# --------------------------------------------------------------------------------------------------------------------- + +$(BINDIR)/ansi-pedantic-test_cxx_ansi: ansi-pedantic-test.cpp ../backend/Carla*.h ../backend/Carla*.hpp ../includes/*.h + $(CXX) $< $(PEDANTIC_CXXFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -ansi -Wno-effc++ -o $@ + +$(BINDIR)/ansi-pedantic-test_cxx98: ansi-pedantic-test.cpp ../backend/Carla*.h ../backend/Carla*.hpp ../includes/*.h + $(CXX) $< $(PEDANTIC_CXXFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c++98 -Wno-effc++ -o $@ + +$(BINDIR)/ansi-pedantic-test_cxx03: ansi-pedantic-test.cpp ../backend/Carla*.h ../backend/Carla*.hpp ../includes/*.h + $(CXX) $< $(PEDANTIC_CXXFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c++03 -Wno-effc++ -o $@ + +$(BINDIR)/ansi-pedantic-test_cxx11: ansi-pedantic-test.cpp ../backend/Carla*.h ../backend/Carla*.hpp ../includes/*.h + $(CXX) $< $(PEDANTIC_CXXFLAGS) $(PEDANTIC_LDFLAGS) -lcarla_standalone2 -lcarla_utils -std=c++11 -o $@ + +# --------------------------------------------------------------------------------------------------------------------- + +clean: + rm -f $(BINDIR)/ansi-pedantic-test_* + +debug: + $(MAKE) DEBUG=true + +# --------------------------------------------------------------------------------------------------------------------- + +$(OBJDIR)/%.c.o: %.c + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CC) $< $(BUILD_C_FLAGS) -c -o $@ + +$(OBJDIR)/%.cpp.o: %.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling $<" + @$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ + +# --------------------------------------------------------------------------------------------------------------------- diff --git a/source/tests/ansi-pedantic-test.c b/source/tests/ansi-pedantic-test.c new file mode 100644 index 000000000..df582e915 --- /dev/null +++ b/source/tests/ansi-pedantic-test.c @@ -0,0 +1,184 @@ +/* + * ANSI pedantic test for the Carla Backend & Host API + * Copyright (C) 2013-2019 Filipe Coelho + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For a full copy of the GNU General Public License see the doc/GPL.txt file. + */ + +#include "CarlaBackend.h" +#include "CarlaHost.h" +#include "CarlaUtils.h" + +#include "CarlaMIDI.h" +#include "CarlaNative.h" +#include "CarlaNativePlugin.h" + +#ifdef __cplusplus +# include "CarlaEngine.hpp" +# include "CarlaPlugin.hpp" +# include +# include +# ifdef CARLA_PROPER_CPP11_SUPPORT +# undef NULL +# define NULL nullptr +# endif +#else +# include +# include +#endif + +#define BOOLEAN_AS_STRING(cond) ((cond) ? "true" : "false") + +int main(int argc, char* argv[]) +{ +#ifdef __cplusplus + CARLA_BACKEND_USE_NAMESPACE +#endif + + ParameterData a; + ParameterRanges b; + MidiProgramData c; + CustomData d; + EngineDriverDeviceInfo e; + + CarlaPluginInfo f; + /*CarlaCachedPluginInfo g;*/ + CarlaPortCountInfo h; + CarlaParameterInfo i; + CarlaScalePointInfo j; + CarlaTransportInfo k; + + const char* licenseText; + const char* const* fileExtensions; + + uint l, count; + + licenseText = carla_get_complete_license_text(); + printf("LICENSE:\n%s\n", licenseText); + + fileExtensions = carla_get_supported_file_extensions(); + printf("FILE EXTENSIONS:\n "); + for (l=0; fileExtensions[l] != NULL; ++l) + printf(" %s", fileExtensions[l]); + printf("\n"); + + count = carla_get_engine_driver_count(); + printf("DRIVER COUNT: %i\n", count); + + for (l=0; l < count; ++l) + { + const char* driverName; + const char* const* driverDeviceNames; + const EngineDriverDeviceInfo* driverDeviceInfo; + uint m, m2, count2; + + driverName = carla_get_engine_driver_name(l); + driverDeviceNames = carla_get_engine_driver_device_names(l); + printf("DRIVER %i/%i: \"%s\" : DEVICES:\n", l+1, count, driverName); + + count2 = 0; + while (driverDeviceNames[count2] != NULL) + ++count2; + + for (m = 0; m < count2; ++m) + { + driverDeviceInfo = carla_get_engine_driver_device_info(l, driverDeviceNames[m]); + printf("DRIVER DEVICE %i/%i: \"%s\"\n", m+1, count2, driverDeviceNames[m]); + printf(" Has control panel: %s\n", BOOLEAN_AS_STRING(driverDeviceInfo->hints & ENGINE_DRIVER_DEVICE_HAS_CONTROL_PANEL)); + printf(" Can triple buffer: %s\n", BOOLEAN_AS_STRING(driverDeviceInfo->hints & ENGINE_DRIVER_DEVICE_CAN_TRIPLE_BUFFER)); + printf(" Variable buffer size: %s\n", BOOLEAN_AS_STRING(driverDeviceInfo->hints & ENGINE_DRIVER_DEVICE_VARIABLE_BUFFER_SIZE)); + printf(" Variable sample rate: %s\n", BOOLEAN_AS_STRING(driverDeviceInfo->hints & ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE)); + + if (driverDeviceInfo->bufferSizes != NULL && driverDeviceInfo->bufferSizes[0] != 0) + { + printf(" Buffer sizes:"); + + m2 = 0; + while (driverDeviceInfo->bufferSizes[m2] != 0) + printf(" %i", driverDeviceInfo->bufferSizes[m2++]); + + printf("\n"); + } + else + { + printf(" Buffer sizes: (null)\n"); + } + + if (driverDeviceInfo->sampleRates != NULL && driverDeviceInfo->sampleRates[0] > 0.1) + { + printf(" Sample rates:"); + + m2 = 0; + while (driverDeviceInfo->sampleRates[m2] > 0.1) + printf(" %.1f", driverDeviceInfo->sampleRates[m2++]); + + printf("\n"); + } + else + { + printf(" Sample rates: (null)\n"); + } + } + } + + carla_set_engine_option(ENGINE_OPTION_PROCESS_MODE, ENGINE_PROCESS_MODE_PATCHBAY, NULL); + carla_set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, ENGINE_TRANSPORT_MODE_INTERNAL, NULL); + + if (carla_engine_init("Dummy", "ansi-test")) + { +#ifdef __cplusplus + CarlaEngine* const engine(carla_get_engine()); + assert(engine != nullptr); + engine->getLastError(); +#endif + if (carla_add_plugin(BINARY_NATIVE, PLUGIN_INTERNAL, NULL, NULL, "audiofile", 0, NULL, 0x0)) + { +#ifdef __cplusplus + CarlaPlugin* const plugin(engine->getPlugin(0)); + assert(plugin != nullptr); + plugin->getId(); +#endif + /* carla_set_custom_data(0, CUSTOM_DATA_TYPE_STRING, "file", "/home/falktx/Music/test.wav"); */ + carla_transport_play(); + } + else + { + printf("%s\n", carla_get_last_error()); + } +#ifdef __cplusplus + engine->setAboutToClose(); +#endif + carla_engine_close(); + } + +#ifdef __cplusplus + EngineControlEvent e1; + EngineMidiEvent e2; + EngineEvent e3; + e3.fillFromMidiData(0, nullptr, 0); + EngineOptions e4; + EngineTimeInfoBBT e5; + EngineTimeInfo e6; +#endif + + /* unused C */ + (void)argc; + (void)argv; + (void)a; (void)b; (void)c; (void)d; (void)e; + (void)f; /*(void)g;*/ (void)h; (void)i; (void)j; (void)k; +#ifdef __cplusplus + (void)e1; (void)e2; (void)e4; (void)e5; (void)e6; +#endif + + return 0; +} diff --git a/source/tests/ansi-pedantic-test.cpp b/source/tests/ansi-pedantic-test.cpp new file mode 120000 index 000000000..e6bbd120c --- /dev/null +++ b/source/tests/ansi-pedantic-test.cpp @@ -0,0 +1 @@ +ansi-pedantic-test.c \ No newline at end of file