mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 10:56:51 -06:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef24afc10c | ||
|
|
6528bb564b | ||
|
|
37150774c6 | ||
|
|
9cf115e808 | ||
|
|
d0281360c2 | ||
|
|
de5aecfe8b | ||
|
|
546b5a1cf3 | ||
|
|
2ab09850bb | ||
|
|
4ab8c384b3 |
@@ -0,0 +1,30 @@
|
||||
name: CI
|
||||
|
||||
# Quality gates for every push to main and every pull request (`cargo xtask ci`), through the
|
||||
# suite's shared gate workflow in craft-common-actions.
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# A newer push to a PR branch cancels its older run; every push to main runs to the end.
|
||||
concurrency:
|
||||
group: ci-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
jobs:
|
||||
gate:
|
||||
# Tracks @main so suite-wide CI fixes reach every app without a PR in each repository.
|
||||
uses: storytold/craft-common-actions/.github/workflows/gate.yml@main
|
||||
with:
|
||||
# Same craft-fonts commit as release.yml.
|
||||
craft-fonts-ref: 3d9ab3a132ed0eff457e424226a435a901da30d3
|
||||
timeout-minutes: 90
|
||||
packages: >-
|
||||
pkg-config libxkbcommon-dev libwayland-dev libx11-dev libxcb1-dev libxcursor-dev
|
||||
libxrandr-dev libxi-dev libfontconfig1-dev libfreetype-dev mesa-vulkan-drivers
|
||||
libgl1-mesa-dev
|
||||
@@ -2,6 +2,9 @@
|
||||
# (GitHub has no FreeBSD runners). GPU tests skip themselves when the VM has no adapter.
|
||||
name: FreeBSD
|
||||
|
||||
# The VM build is slow, so it runs nightly on main and on pushes to `release`, not on every pull
|
||||
# request: a drifted dependency still shows up within a day, and always before a release ships.
|
||||
# PRs that change the FreeBSD workflow or packaging itself still run it.
|
||||
on:
|
||||
push:
|
||||
branches: [release]
|
||||
|
||||
@@ -3,15 +3,17 @@
|
||||
# binaries are ARM64, run the CLI natively, and uninstall.
|
||||
name: Windows ARM64
|
||||
|
||||
# Nightly on main and on pushes to `release` (dependency and runner-image drift shows up within a
|
||||
# day, and always before a release ships), and on PRs that change the Windows packaging itself.
|
||||
on:
|
||||
schedule:
|
||||
- cron: "3 5 * * *"
|
||||
push:
|
||||
branches: [release]
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/windows-arm64.yml
|
||||
- packaging/windows/**
|
||||
schedule:
|
||||
- cron: "41 3 * * 1"
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
|
||||
@@ -69,9 +69,11 @@ type_complexity = "allow"
|
||||
|
||||
[profile.dev.package."*"]
|
||||
opt-level = 2
|
||||
debug = false
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 1
|
||||
debug = "line-tables-only"
|
||||
|
||||
[profile.release]
|
||||
opt-level = 3
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
mod cli;
|
||||
mod drafting_spacing;
|
||||
mod help;
|
||||
mod mcp_connect;
|
||||
mod skipped_records;
|
||||
mod undrawn_entities;
|
||||
@@ -0,0 +1,2 @@
|
||||
mod lin_pat_parse;
|
||||
mod sub_segment_alias;
|
||||
@@ -29,7 +29,7 @@ fn session() -> (Session, Handle) {
|
||||
/// As [`session`], with the fixture's text changed by `edit` first.
|
||||
fn session_with(edit: impl Fn(String) -> String) -> (Session, Handle) {
|
||||
let grip = "0 BLOCKLINEARGRIP\n5 68\n330 61\n100 AcDbEvalExpr\n90 9\n98 33\n99 232\n100 AcDbBlockElement\n300 End Grip\n98 33\n99 232\n1071 0\n";
|
||||
let src = include_str!("../../io/tests/data/dynblock_door.txt")
|
||||
let src = include_str!("../../../io/tests/data/dynblock_door.txt")
|
||||
.replace("\r\n", "\n")
|
||||
.replace("170 4\n91 0\n91 0\n", "170 4\n91 8\n91 9\n")
|
||||
.replace("1030 0\n93 0\n170 0\n171 0\n100 AcDbBlockVisibilityParameter", "1030 0\n93 10\n170 0\n171 0\n100 AcDbBlockVisibilityParameter")
|
||||
@@ -2,7 +2,6 @@
|
||||
//! leave exactly the expected entities, layers and printed text. The corpus lives in its own
|
||||
//! repository; point `CADCRAFT_LISP_CORPUS` at its `cases` directory (or the repository) to run
|
||||
//! it. Without it the test only says so.
|
||||
#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
mod angle_prompts;
|
||||
mod angle_settings;
|
||||
mod annotate_options;
|
||||
mod annotative;
|
||||
mod arc_ctrl_direction;
|
||||
mod array_commands;
|
||||
mod assoc_array;
|
||||
mod attdisp_attsync;
|
||||
mod attedit_prompts;
|
||||
mod attrib_modes;
|
||||
mod attrib_props;
|
||||
mod attribute_tools;
|
||||
mod block_keep;
|
||||
mod block_redefine;
|
||||
mod break_closed_polyline;
|
||||
mod break_join_locked_layers;
|
||||
mod break_keeps_z;
|
||||
mod burst;
|
||||
mod constraint_geometry;
|
||||
mod constraint_infer;
|
||||
mod count;
|
||||
mod dash_block;
|
||||
mod data_extraction;
|
||||
mod dim_baseline_spacing;
|
||||
mod dim_chain;
|
||||
mod dim_commands;
|
||||
mod dim_explode_text;
|
||||
mod dim_properties;
|
||||
mod dim_radial_inside;
|
||||
mod dim_radial_outside;
|
||||
mod dim_vars;
|
||||
mod dimtedit_prompts;
|
||||
mod drafting_spacing;
|
||||
mod draw_prompts;
|
||||
mod draworder;
|
||||
mod dyn_input;
|
||||
mod dynamic_block_data;
|
||||
mod dynamic_grips;
|
||||
mod fillet_chamfer;
|
||||
mod fix_holds_grips;
|
||||
mod followups_626;
|
||||
mod grip_dim_input;
|
||||
mod grip_options;
|
||||
mod grip_selection;
|
||||
mod group_selection;
|
||||
mod groups;
|
||||
mod hatch_assoc;
|
||||
mod hatch_dialog_helpers;
|
||||
mod hatch_numeric_validation;
|
||||
mod hatch_options;
|
||||
mod helix;
|
||||
mod inquiry_keywords;
|
||||
mod inquiry_z;
|
||||
mod insert_prompts;
|
||||
mod isometric;
|
||||
mod join_close;
|
||||
mod json_param_validation;
|
||||
mod layer_cmdline;
|
||||
mod layer_merge_delete;
|
||||
mod layoff_repeat;
|
||||
mod layout_prompts;
|
||||
#[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
|
||||
mod lisp_corpus;
|
||||
mod malformed_handles;
|
||||
mod matchprop;
|
||||
mod measure_distance_snapping;
|
||||
mod metric_linetypes;
|
||||
mod mleader_content;
|
||||
mod mleader_remember;
|
||||
mod mline;
|
||||
mod mocoro;
|
||||
mod modify_curves;
|
||||
mod mtext_columns;
|
||||
mod mtext_options;
|
||||
mod multiline_attributes;
|
||||
mod named_views;
|
||||
mod non_finite_edits;
|
||||
mod offset_closed_spline;
|
||||
mod offset_ellipse_side;
|
||||
mod offset_move;
|
||||
mod options_profile;
|
||||
mod overkill;
|
||||
mod parallel_display_list;
|
||||
mod pedit_splinedit;
|
||||
mod pick_text;
|
||||
mod pickdrag;
|
||||
mod pline_arc_xline_options;
|
||||
mod plot_styles;
|
||||
mod point_modifiers;
|
||||
mod post_command_passes;
|
||||
mod prompt_keywords;
|
||||
mod props_bad_lineweight;
|
||||
mod props_insert_scale_attribs;
|
||||
mod purge_mlinestyles;
|
||||
mod purge_prompts;
|
||||
mod qdim;
|
||||
mod qdim_modes;
|
||||
mod query_entities;
|
||||
mod quickcalc;
|
||||
mod recent_commands;
|
||||
mod rectang_ortho;
|
||||
mod refedit;
|
||||
mod region;
|
||||
mod rename_cmdline;
|
||||
mod rotate_reference;
|
||||
mod select_keywords;
|
||||
mod select_similar;
|
||||
mod select_underscore_keywords;
|
||||
mod selection_cycling;
|
||||
mod selection_modes;
|
||||
mod setvar_coverage;
|
||||
mod shapes;
|
||||
mod snap_annotations;
|
||||
mod snap_blocks;
|
||||
mod snap_curves;
|
||||
mod snap_intersections_aperture;
|
||||
mod snap_nearest;
|
||||
mod snap_overrides;
|
||||
mod snap_tracking;
|
||||
mod snaps_more;
|
||||
mod space_is_enter;
|
||||
mod spline_degree;
|
||||
mod spline_options;
|
||||
mod stretch;
|
||||
mod stretch_select;
|
||||
mod table_formulas;
|
||||
mod table_styles;
|
||||
mod temp_tracking;
|
||||
mod text_commands;
|
||||
mod text_left_justify;
|
||||
mod tolerance;
|
||||
mod transparent;
|
||||
mod trim_closed_polyline;
|
||||
mod trim_extend_options;
|
||||
mod undo_count;
|
||||
mod undo_layout_tab;
|
||||
mod viewport_clip;
|
||||
mod vplayer_prompts;
|
||||
mod vports;
|
||||
mod xdata_follows_entity;
|
||||
mod zoom_keywords;
|
||||
mod zoom_viewport;
|
||||
mod zoom_window_ortho;
|
||||
@@ -1,7 +1,9 @@
|
||||
//! OFFSET Erase/Layer/Multiple/Undo and the MOVE/COPY Displacement option at the command line.
|
||||
|
||||
use cadcraft_engine::Input;
|
||||
use cadcraft_engine::Session;
|
||||
use cadcraft_engine::doc::EntityKind;
|
||||
use cadcraft_engine::geom::Vec2;
|
||||
use serde_json::json;
|
||||
|
||||
/// Every line as ((ax, ay), (bx, by), layer), sorted by the first y.
|
||||
@@ -62,6 +64,27 @@ fn offset_multiple_and_undo() {
|
||||
assert_eq!(lines(&s), vec![l((0.0, 0.0), (10.0, 0.0), "0"), l((0.0, 2.0), (10.0, 2.0), "0"), l((0.0, 4.0), (10.0, 4.0), "0")]);
|
||||
}
|
||||
|
||||
// Regression test for #618: OFFSET's distance prompt took only a typed number; clicking two points
|
||||
// (the distance between them) was rejected, and the second click had no distance guide.
|
||||
#[test]
|
||||
fn offset_distance_from_two_clicked_points() {
|
||||
let mut s = one_line();
|
||||
s.start("offset").unwrap();
|
||||
s.input(Input::Point(Vec2::new(20.0, 20.0))).unwrap();
|
||||
let p = s.current_prompt().unwrap();
|
||||
assert!(p.message.contains("second point"), "{}", s.prompt_text());
|
||||
assert!(p.base.is_some_and(|b| b.near(Vec2::new(20.0, 20.0), 1e-9)), "the second click is measured from the first");
|
||||
// The guide from the first click to the cursor is the previewed distance.
|
||||
let guide = s.preview(Vec2::new(20.0, 22.5));
|
||||
assert!(matches!(guide.first().map(|e| &e.kind), Some(EntityKind::Line(g)) if g.a.xy().near(Vec2::new(20.0, 20.0), 1e-9)), "{guide:?}");
|
||||
s.input(Input::Point(Vec2::new(20.0, 22.5))).unwrap();
|
||||
assert!(s.current_prompt().unwrap().message.contains("Select object"), "{}", s.prompt_text());
|
||||
assert_eq!(s.doc().unwrap().header.f64("OFFSETDIST", -1.0), 2.5);
|
||||
s.script("5,0 5,1\n\n").unwrap();
|
||||
assert!(s.running.is_none(), "{}", s.prompt_text());
|
||||
assert_eq!(lines(&s), vec![l((0.0, 0.0), (10.0, 0.0), "0"), l((0.0, 2.5), (10.0, 2.5), "0")]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn offset_json_erase_and_layer() {
|
||||
let mut s = one_line();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user