Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add vt insert and movement tests #21

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,33 @@ jobs:

check_clang_format:
name: "Check C++ style"
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v3
- name: Install clang
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 17
sudo apt-get install clang-format-17
sudo ./llvm.sh 18
sudo apt-get install clang-format-18
- name: "Clang-format libtermbench"
run: find ./libtermbench -name "*.cpp" -o -name "*.h" | xargs clang-format-17 --Werror --dry-run
run: find ./libtermbench -name "*.cpp" -o -name "*.h" | xargs clang-format-18 --Werror --dry-run
- name: "Clang-format tb"
run: find ./tb -name "*.cpp" -o -name "*.h" | xargs clang-format-17 --Werror --dry-run
run: find ./tb -name "*.cpp" -o -name "*.h" | xargs clang-format-18 --Werror --dry-run
- name: "Check includes"
run: ./scripts/check-includes.sh

ubuntu_linux:
name: "Ubuntu Linux 22.04"
runs-on: ubuntu-22.04
name: "Ubuntu Linux 24.04"
runs-on: ubuntu-24.04
env:
CMAKE_PRESET: "linux-gcc-release"
steps:
- uses: actions/checkout@v3
- name: ccache
uses: hendrikmuhs/ccache-action@v1
with:
key: "ccache-ubuntu_2204"
key: "ccache-ubuntu_2404"
max-size: 256M
- name: set environment variables
id: set_vars
Expand All @@ -67,18 +67,18 @@ jobs:
sudo apt -q update
sudo apt install -qy ninja-build
sudo ./scripts/install-deps.sh
- name: "Install GCC 13"
run: sudo apt install g++-13
- name: "Install GCC"
run: sudo apt install g++
- name: "cmake"
run: cmake --preset "$CMAKE_PRESET" -D CMAKE_CXX_COMPILER="g++-13"
run: cmake --preset "$CMAKE_PRESET" -D CMAKE_CXX_COMPILER="g++"
- name: "build"
run: cmake --build --preset "$CMAKE_PRESET" --preset -- -j3
- name: "install dependencies for running benchmarks"
run: ./scripts/xvfb-deps.sh
- name: "Install contour"
run: |
wget https://github.com/contour-terminal/contour/releases/download/v$CONTOUR_VERSION/contour-$CONTOUR_VERSION-ubuntu22.04-amd64.deb
sudo dpkg -i contour-$CONTOUR_VERSION-ubuntu22.04-amd64.deb
wget https://github.com/contour-terminal/contour/releases/download/v$CONTOUR_VERSION/contour-$CONTOUR_VERSION-ubuntu24.04-amd64.deb
sudo dpkg -i contour-$CONTOUR_VERSION-ubuntu24.04-amd64.deb
- name: "create and patch contour.yml config file"
run: |
set -ex
Expand Down
19 changes: 17 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,30 @@ benefit from this library, if not even integrating it.
Adding a C-API binding is considered as soon there is also interest
from other projects that cannot use the C++ API.


## Run tests
To run tests you need to spawn `tb` executable from terminal, for example:
` contour $(pwd)/build/tb/tb --fixed-size --column-by-column --size 2 --output contour_results`
for more info run `tb --hlep`
In folder scripts you can find some convinent scripts for testing different terminals and way to create results afterwards,
you can run

``` sh
./scripts/Xvfb-bench-run.sh $(pwd)/build/tb/tb
julia scripts/plot_results.jl
```

This will run benchmark in background and plot results with julia afterwards

## Test coverage

- [x] long text lines
- [x] short text lines
- [x] text lines with foreground color
- [x] text lines with foreground & background color
- [ ] cursor movement (`CUB`, `CUD`, `CUF`, `CUP`, `CUU`)
- [x] cursor movement (`CUB`, `CUD`, `CUF`, `CUP`, `CUU`)
- [ ] rectangular operations (`DECCRA`, `DECFRA`, `DECERA`)
- [ ] insert lines/columns (`IL`, `DECIC`)
- [x] insert lines/columns (`IL`, `DECIC`)
- [ ] delete lines (`DL`)
- [ ] erase lines/columns (`EL`, `ED`)
- [ ] complex unicode LTR
Expand Down
52 changes: 36 additions & 16 deletions libtermbench/termbench.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ void Benchmark::runAll()

void Benchmark::summarizeToJson(std::ostream& os)
{
std::string buffer = glz::write_json(results_);
os << buffer;
auto buffer = glz::write_json(results_);
os << buffer.value();
}

void Benchmark::summarize(std::ostream& os)
Expand Down Expand Up @@ -416,14 +416,14 @@ std::unique_ptr<Test> binary()

std::unique_ptr<Test> ascii_line(size_t line_length)
{
auto name = std::to_string(line_length) + " chars per line";
auto name = std::to_string(line_length) + "_chars_per_line";
auto text = std::string(line_length, 'a') + std::string { "\n" };
return std::make_unique<Line>(name, text);
}

std::unique_ptr<Test> sgr_line(size_t line_length)
{
auto name = std::to_string(line_length) + " chars with sgr per line";
auto name = std::to_string(line_length) + "_chars_with_sgr_per_line";
std::string text {};
text += "\033[38;2;20;200;200m";
text += std::string(line_length, 'a');
Expand All @@ -434,7 +434,7 @@ std::unique_ptr<Test> sgr_line(size_t line_length)

std::unique_ptr<Test> sgrbg_line(size_t line_length)
{
auto name = std::to_string(line_length) + " chars with sgr and bg per line";
auto name = std::to_string(line_length) + "_chars_with_sgr_and_bg_per_line";
std::string text {};
text += "\033[38;2;20;200;200m\033[48;2;100;100;100m";
text += std::string(line_length, 'a');
Expand All @@ -445,7 +445,7 @@ std::unique_ptr<Test> sgrbg_line(size_t line_length)

std::unique_ptr<Test> unicode_simple(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode simple";
auto name = std::to_string(line_length) + "_unicode_simple";
std::string text {};
for (size_t i = 0; i < line_length; ++i)
text += "\u0061";
Expand All @@ -455,7 +455,7 @@ std::unique_ptr<Test> unicode_simple(size_t line_length)

std::unique_ptr<Test> unicode_two_codepoints(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode diacritic";
auto name = std::to_string(line_length) + "_unicode_diacritic";
std::string text {};
for (size_t i = 0; i < line_length; ++i)
text += "\u0061\u0308";
Expand All @@ -465,37 +465,57 @@ std::unique_ptr<Test> unicode_two_codepoints(size_t line_length)

std::unique_ptr<Test> unicode_three_codepoints(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode double diacritic";
auto name = std::to_string(line_length) + "_unicode_double_diacritic";
std::string text {};
for (size_t i = 0; i < static_cast<size_t>(line_length / 2); ++i)
text += "\u0061\u035D\u0062";
text += "\n";
return std::make_unique<Line>(name, text);
}

std::unique_ptr<Test> unicode_fire_as_text(size_t line_length)
std::unique_ptr<Test> unicode_fire(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode fire as text";
auto name = std::to_string(line_length) + "_unicode_fire";
std::string text {};
for (size_t i = 0; i < static_cast<size_t>(line_length / 2); ++i)
text += std::string { "\U0001F525\U0000FE0E" };
text += std::string { "\U0001F525" };
text += std::string { "\n" };
return std::make_unique<Line>(name, text);
}

std::unique_ptr<Test> unicode_fire(size_t line_length)
/* Creates rectangular block:
* u --- f
* | |
* b --- d
* with each side being line_length long.
* */
std::unique_ptr<Test> vt_movement(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode fire";
auto name = std::to_string(line_length) + "_vt_movement";
std::string text {};
for (size_t i = 0; i < static_cast<size_t>(line_length / 2); ++i)
text += std::string { "\U0001F525" };
text += std::format("\033[{}Au\033[1D", line_length); // up
text += std::format("\033[{}Cf\033[1D", line_length); // forward
text += std::format("\033[{}Bd\033[1D", line_length); // down
text += std::format("\033[{}Db\033[1D", line_length); // backward
text += std::string { "\n" };
return std::make_unique<Line>(name, text);
}

/* Inserts lines and columns
*/
std::unique_ptr<Test> vt_insert(size_t line_length)
{
auto name = std::to_string(line_length) + "_vt_insert";
std::string text {};
text += std::format("\033[{}L", line_length); // insert lines IL
text += std::format("\033[{}{}", line_length, "'}"); // insert columns DECIC
text += std::string { "\n" };
return std::make_unique<Line>(name, text);
}

std::unique_ptr<Test> unicode_flag(size_t line_length)
{
auto name = std::to_string(line_length) + " unicode flag";
auto name = std::to_string(line_length) + "_unicode_flag";
std::string text {};
std::string flag {};
flag += "\U0001F3F4";
Expand Down
3 changes: 2 additions & 1 deletion libtermbench/termbench.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,11 @@ std::unique_ptr<Test> ascii_line(size_t);
std::unique_ptr<Test> sgr_line(size_t);
std::unique_ptr<Test> sgrbg_line(size_t);
std::unique_ptr<Test> unicode_simple(size_t);
std::unique_ptr<Test> vt_movement(size_t);
std::unique_ptr<Test> vt_insert(size_t);
std::unique_ptr<Test> unicode_two_codepoints(size_t);
std::unique_ptr<Test> unicode_three_codepoints(size_t);
std::unique_ptr<Test> unicode_flag(size_t);
std::unique_ptr<Test> unicode_fire_as_text(size_t); // U+FEOE
std::unique_ptr<Test> unicode_fire(size_t);
std::unique_ptr<Test> crafted(std::string name, std::string description, std::string text);
} // namespace termbench::tests
5 changes: 4 additions & 1 deletion scripts/Xvfb-bench-run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,12 @@ function program_exit() {
function bench_terminal() {
printf "\033[1m==> Running terminal: $1\033[m\n"
local terminal_name=$(basename $1)
time "${@}" -e "${TB_BIN}" --fixed-size --column-by-column --size 2 --output "${OUTPUT_DIR}/${terminal_name}_results"
time "${@}" -e "${TB_BIN}" --fixed-size --column-by-column --size 1 --output "${OUTPUT_DIR}/${terminal_name}_results"
local exit_code=$?
printf "\033[1m==> Terminal exit code: $exit_code\033[m\n"
if [[ $exit_code -ne 0 ]]; then
program_exit $exit_code
fi
}

set -x
Expand Down
39 changes: 25 additions & 14 deletions scripts/plot_results.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Pkg
Pkg.add("CairoMakie")
Pkg.add("JSON")
Pkg.instantiate()
using CairoMakie
using JSON

Expand All @@ -20,23 +21,25 @@ end

function get_values(data, data_type)
if data_type == :ascii
name = "chars per line"
name = "chars_per_line"
elseif data_type == :sgr
name = "chars with sgr per line"
name = "chars_with_sgr_per_line"
elseif data_type == :sgr_bg
name = "chars with sgr and bg per line"
name = "chars_with_sgr_and_bg_per_line"
elseif data_type == :unicode
name = "unicode simple"
name = "unicode_simple"
elseif data_type == :diacritic
name = "unicode diacritic"
name = "unicode_diacritic"
elseif data_type == :diacritic_double
name = "unicode double diacritic"
name = "unicode_double_diacritic"
elseif data_type == :fire
name = "unicode fire"
elseif data_type == :fire_text
name = "unicode fire as text"
name = "unicode_fire"
elseif data_type == :vt_movement
name = "vt_movement"
elseif data_type == :vt_insert
name = "vt_insert"
elseif data_type == :flag
name = "unicode flag"
name = "unicode_flag"
end

lines = Vector{Float64}()
Expand Down Expand Up @@ -67,14 +70,14 @@ function generate_for_terminal(file_name, prefix="results_")

data = get_data(file_name)

markers = [:circle :rect :cross :star4 :start5 :star6 :diamond]
markers = [:circle :rect :cross :star4 :star5 :star6 :diamond]

get_values_l = (type) -> get_values(data,type)
speed = [ get_values_l(t) for t in types]

marker_size = 8
for (ind,dat) in enumerate(speed)
scatter!(ax,dat, label= terminal_name * "_" * string(types[ind]), marker = markers[ind], markersize = marker_size)
scatter!(ax, dat,label= terminal_name * "_" * string(types[ind]), marker = markers[ind], markersize = marker_size)
end
axislegend(position = :rt)

Expand Down Expand Up @@ -108,13 +111,21 @@ generate_for_terminal("alacritty_results")
generate_for_terminal("xterm_results")
generate_for_terminal("kitty_results")
generate_for_terminal("wezterm_results")
types = [:unicode :fire :flag :diacritic :diacritic_double :fire_text]
types = [:unicode :fire :flag :diacritic :diacritic_double]
generate_for_terminal_l = (n) -> generate_for_terminal(n, "results_unicode_")
generate_for_terminal_l("contour_results")
generate_for_terminal_l("alacritty_results")
generate_for_terminal_l("xterm_results")
generate_for_terminal_l("kitty_results")
generate_for_terminal_l("wezterm_results")
types = [:vt_movement :vt_insert]
generate_for_terminal_l = (n) -> generate_for_terminal(n, "results_vt_")
generate_for_terminal_l("contour_results")
generate_for_terminal_l("alacritty_results")
generate_for_terminal_l("xterm_results")
generate_for_terminal_l("kitty_results")
generate_for_terminal_l("wezterm_results")


types = [:ascii :sgr :sgr_bg :unicode :fire :fire_text :flag :diacritic :diacritic_double]
types = [:ascii :sgr :sgr_bg :unicode :fire :flag :diacritic :diacritic_double :vt_movement :vt_insert]
[ save("comparison_"*string(type)*".png", generate_comparison(type)) for type in types ]
14 changes: 7 additions & 7 deletions scripts/xvfb-deps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ packages="
xvfb \
\
ffmpeg \
libavcodec58 \
libavdevice58 \
libavformat58 \
libavutil56 \
libavcodec60 \
libavdevice60 \
libavformat60 \
libavutil58 \
libdeflate0 \
libncurses6 \
libqrcodegen1 \
libswscale5 \
libunistring2 \
libswscale7 \
libunistring5 \
\
libfontconfig1 \
libfreetype6 \
Expand All @@ -58,7 +58,7 @@ packages="
qtquickcontrols2-5-dev \
\
libutempter0 \
libyaml-cpp0.7\
libyaml-cpp0.8
\
cargo
"
Expand Down
5 changes: 3 additions & 2 deletions tb/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ struct TestsToRun
struct BenchSettings
{
TerminalSize requestedTerminalSize {};
size_t testSizeMB = 32;
size_t testSizeMB = 1;
bool nullSink = false;
bool stdoutFastPath = false;
std::vector<std::filesystem::path> craftedTests {};
Expand Down Expand Up @@ -252,11 +252,12 @@ bool addTestsToBenchmark(termbench::Benchmark& tb, BenchSettings const& settings
add_test(termbench::tests::unicode_simple);
add_test(termbench::tests::unicode_two_codepoints);
add_test(termbench::tests::unicode_three_codepoints);
add_test(termbench::tests::unicode_fire_as_text);
add_test(termbench::tests::unicode_fire);
add_test(termbench::tests::unicode_flag);
add_test(termbench::tests::sgr_line);
add_test(termbench::tests::sgrbg_line);
add_test(termbench::tests::vt_movement);
add_test(termbench::tests::vt_insert);
}
return true;
}
Expand Down
Loading