mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-10 10:08:02 -06:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9633611ae8 | ||
|
|
897b9b8621 | ||
|
|
ee2569b70c | ||
|
|
84caa6c25f | ||
|
|
f92c9175b9 |
41
.github/workflows/coverage.yaml
vendored
41
.github/workflows/coverage.yaml
vendored
@@ -9,8 +9,6 @@ env:
|
||||
jobs:
|
||||
coverage:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v5
|
||||
@@ -48,35 +46,12 @@ jobs:
|
||||
|
||||
- name: Generate coverage report
|
||||
run: |
|
||||
just coverage
|
||||
just coverage-codecov
|
||||
|
||||
- name: Download Coveralls CLI
|
||||
if: ${{ env.COVERALLS_REPO_TOKEN != '' }}
|
||||
run: |
|
||||
# use GitHub Releases URL instead of coveralls.io because they can't maintain their own files; it 404s
|
||||
curl -L https://github.com/coverallsapp/coverage-reporter/releases/download/v0.6.15/coveralls-linux-x86_64.tar.gz | tar -xz -C /usr/local/bin
|
||||
|
||||
- name: Upload coverage to Coveralls
|
||||
if: ${{ env.COVERALLS_REPO_TOKEN != '' }}
|
||||
run: |
|
||||
if [ ! -f "lcov.info" ]; then
|
||||
echo "Error: lcov.info file not found. Coverage generation may have failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in {1..10}; do
|
||||
echo "Attempt $i: Uploading coverage to Coveralls..."
|
||||
if coveralls -n report lcov.info; then
|
||||
echo "Successfully uploaded coverage report."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ $i -lt 10 ]; then
|
||||
delay=$((2**i))
|
||||
echo "Attempt $i failed. Retrying in $delay seconds..."
|
||||
sleep $delay
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Failed to upload coverage report after 10 attempts."
|
||||
exit 1
|
||||
- name: Upload coverage reports to Codecov
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./codecov.json
|
||||
disable_search: true
|
||||
verbose: true
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -14,6 +14,7 @@ assets/site/build.css
|
||||
|
||||
# Coverage reports
|
||||
lcov.info
|
||||
codecov.json
|
||||
coverage.html
|
||||
|
||||
# Profiling output
|
||||
|
||||
22
Justfile
22
Justfile
@@ -2,8 +2,8 @@ set shell := ["bash", "-c"]
|
||||
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
|
||||
|
||||
# Regex to exclude files from coverage report, double escapes for Justfile + CLI
|
||||
# You can use src\\\\..., but the filename alone is acceptable too
|
||||
coverage_exclude_pattern := "src\\\\app\\.rs|audio\\.rs|src\\\\error\\.rs|platform\\\\emscripten\\.rs|bin\\\\.+\\.rs|main\\.rs|platform\\\\desktop\\.rs|platform\\\\tracing_buffer\\.rs|platform\\\\buffered_writer\\.rs|systems\\\\debug\\.rs|systems\\\\profiling\\.rs"
|
||||
# You can use src/..., but the filename alone is acceptable too
|
||||
coverage_exclude_pattern := "src/app\\.rs|audio\\.rs|src/error\\.rs|platform/emscripten\\.rs|bin/.+\\.rs|main\\.rs|platform/desktop\\.rs|platform/tracing_buffer\\.rs|platform/buffered_writer\\.rs|systems/debug\\.rs|systems/profiling\\.rs"
|
||||
|
||||
binary_extension := if os() == "windows" { ".exe" } else { "" }
|
||||
|
||||
@@ -11,7 +11,7 @@ binary_extension := if os() == "windows" { ".exe" } else { "" }
|
||||
# !!! --remap-path-prefix prevents the absolute path from being used in the generated report
|
||||
|
||||
# Generate HTML report (for humans, source line inspection)
|
||||
html: coverage
|
||||
html: coverage-lcov
|
||||
cargo llvm-cov report \
|
||||
--remap-path-prefix \
|
||||
--ignore-filename-regex "{{ coverage_exclude_pattern }}" \
|
||||
@@ -19,13 +19,13 @@ html: coverage
|
||||
--open
|
||||
|
||||
# Display report (for humans)
|
||||
report-coverage: coverage
|
||||
report-coverage: coverage-lcov
|
||||
cargo llvm-cov report \
|
||||
--remap-path-prefix \
|
||||
--ignore-filename-regex "{{ coverage_exclude_pattern }}"
|
||||
|
||||
# Run & generate report (for CI)
|
||||
coverage:
|
||||
# Run & generate LCOV report (as base report)
|
||||
coverage-lcov:
|
||||
cargo llvm-cov \
|
||||
--lcov \
|
||||
--remap-path-prefix \
|
||||
@@ -34,6 +34,16 @@ coverage:
|
||||
--profile coverage \
|
||||
--no-fail-fast nextest
|
||||
|
||||
# Run & generate Codecov report (for CI)
|
||||
coverage-codecov:
|
||||
cargo llvm-cov \
|
||||
--codecov \
|
||||
--remap-path-prefix \
|
||||
--ignore-filename-regex "{{ coverage_exclude_pattern }}" \
|
||||
--output-path codecov.json \
|
||||
--profile coverage \
|
||||
--no-fail-fast nextest
|
||||
|
||||
# Profile the project using 'samply'
|
||||
samply:
|
||||
cargo build --profile profile
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
# Pac-Man
|
||||
|
||||
[![Tests Status][badge-test]][test] [![Build Status][badge-build]][build] [![If you're seeing this, Coveralls.io is broken again and it's not my fault.][badge-coverage]][coverage] [![Online Demo][badge-online-demo]][demo] [![Last Commit][badge-last-commit]][commits]
|
||||
[![Tests Status][badge-test]][test] [![Build Status][badge-build]][build] [![Code Coverage][badge-coverage]][coverage] [![Online Demo][badge-online-demo]][demo] [![Last Commit][badge-last-commit]][commits]
|
||||
|
||||
[badge-test]: https://github.com/Xevion/Pac-Man/actions/workflows/tests.yaml/badge.svg
|
||||
[badge-build]: https://github.com/Xevion/Pac-Man/actions/workflows/build.yaml/badge.svg
|
||||
[badge-coverage]: https://coveralls.io/repos/github/Xevion/Pac-Man/badge.svg?branch=master
|
||||
[badge-coverage]: https://codecov.io/github/Xevion/Pac-Man/branch/master/graph/badge.svg?token=R2RBYUQK3I
|
||||
[badge-demo]: https://img.shields.io/github/deployments/Xevion/Pac-Man/github-pages?label=GitHub%20Pages
|
||||
[badge-online-demo]: https://img.shields.io/badge/GitHub%20Pages-Demo-brightgreen
|
||||
[badge-last-commit]: https://img.shields.io/github/last-commit/Xevion/Pac-Man
|
||||
[build]: https://github.com/Xevion/Pac-Man/actions/workflows/build.yaml
|
||||
[test]: https://github.com/Xevion/Pac-Man/actions/workflows/tests.yaml
|
||||
[coverage]: https://coveralls.io/github/Xevion/Pac-Man?branch=master
|
||||
[coverage]: https://codecov.io/github/Xevion/Pac-Man
|
||||
[demo]: https://xevion.github.io/Pac-Man/
|
||||
[commits]: https://github.com/Xevion/Pac-Man/commits/master
|
||||
|
||||
|
||||
3
codecov.yml
Normal file
3
codecov.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
ignore:
|
||||
- "src/(?:bin|platform))/.+\\.rs"
|
||||
- "src/(?:app|events|formatter)\\.rs"
|
||||
115
tests/ttf.rs
Normal file
115
tests/ttf.rs
Normal file
@@ -0,0 +1,115 @@
|
||||
use pacman::texture::ttf::{TtfAtlas, TtfRenderer};
|
||||
use sdl2::pixels::Color;
|
||||
|
||||
mod common;
|
||||
|
||||
#[test]
|
||||
fn text_width_calculates_correctly_for_empty_string() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer = TtfRenderer::new(1.0);
|
||||
let width = renderer.text_width(&atlas, "");
|
||||
|
||||
assert_eq!(width, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn text_width_calculates_correctly_for_single_character() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer = TtfRenderer::new(1.0);
|
||||
let width = renderer.text_width(&atlas, "A");
|
||||
|
||||
assert!(width > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn text_width_scales_correctly() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer1 = TtfRenderer::new(1.0);
|
||||
let renderer2 = TtfRenderer::new(2.0);
|
||||
|
||||
let width1 = renderer1.text_width(&atlas, "Test");
|
||||
let width2 = renderer2.text_width(&atlas, "Test");
|
||||
|
||||
assert_eq!(width2, width1 * 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn text_height_returns_non_zero_for_valid_atlas() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer = TtfRenderer::new(1.0);
|
||||
let height = renderer.text_height(&atlas);
|
||||
|
||||
assert!(height > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn text_height_scales_correctly() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer1 = TtfRenderer::new(1.0);
|
||||
let renderer2 = TtfRenderer::new(2.0);
|
||||
|
||||
let height1 = renderer1.text_height(&atlas);
|
||||
let height2 = renderer2.text_height(&atlas);
|
||||
|
||||
assert_eq!(height2, height1 * 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_text_handles_empty_string() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer = TtfRenderer::new(1.0);
|
||||
let result = renderer.render_text(&mut canvas, &mut atlas, "", glam::Vec2::new(0.0, 0.0), Color::WHITE);
|
||||
|
||||
assert!(result.is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn render_text_handles_single_character() {
|
||||
let (mut canvas, texture_creator, _sdl) = common::setup_sdl().unwrap();
|
||||
let _ttf_context = sdl2::ttf::init().unwrap();
|
||||
let font = _ttf_context.load_font("assets/game/TerminalVector.ttf", 16).unwrap();
|
||||
|
||||
let mut atlas = TtfAtlas::new(&texture_creator, &font).unwrap();
|
||||
atlas.populate_atlas(&mut canvas, &texture_creator, &font).unwrap();
|
||||
|
||||
let renderer = TtfRenderer::new(1.0);
|
||||
let result = renderer.render_text(&mut canvas, &mut atlas, "A", glam::Vec2::new(10.0, 10.0), Color::RED);
|
||||
|
||||
assert!(result.is_ok());
|
||||
}
|
||||
Reference in New Issue
Block a user