feat(xtask): generate JSON schema for cli TestSummary

This commit is contained in:
Will Lillis 2025-10-31 18:23:21 -04:00
parent d546e28abf
commit c7b5f89392
9 changed files with 376 additions and 7 deletions

View file

@ -11,6 +11,7 @@ use anstyle::{AnsiColor, Color, RgbColor};
use anyhow::{anyhow, Context, Result};
use clap::ValueEnum;
use log::info;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use tree_sitter::{
ffi, InputEdit, Language, LogType, ParseOptions, ParseState, Parser, Point, Range, Tree,
@ -19,7 +20,7 @@ use tree_sitter::{
use crate::{fuzz::edits::Edit, logger::paint, util};
#[derive(Debug, Default, Serialize)]
#[derive(Debug, Default, Serialize, JsonSchema)]
pub struct Stats {
pub successful_parses: usize,
pub total_parses: usize,

View file

@ -18,6 +18,7 @@ use regex::{
bytes::{Regex as ByteRegex, RegexBuilder as ByteRegexBuilder},
Regex,
};
use schemars::{JsonSchema, Schema, SchemaGenerator};
use serde::Serialize;
use similar::{ChangeTag, TextDiff};
use tree_sitter::{format_sexp, Language, LogType, Parser, Query, Tree};
@ -139,36 +140,47 @@ pub struct TestOptions<'a> {
}
/// A stateful object used to collect results from running a grammar's test suite
#[derive(Debug, Default, Serialize)]
#[derive(Debug, Default, Serialize, JsonSchema)]
pub struct TestSummary {
// Parse test results and associated data
#[schemars(schema_with = "schema_as_array")]
#[serde(serialize_with = "serialize_as_array")]
pub parse_results: TestResultHierarchy,
pub parse_failures: Vec<TestFailure>,
pub parse_stats: Stats,
#[schemars(skip)]
#[serde(skip)]
pub has_parse_errors: bool,
#[schemars(skip)]
#[serde(skip)]
pub parse_stat_display: TestStats,
// Other test results
#[schemars(schema_with = "schema_as_array")]
#[serde(serialize_with = "serialize_as_array")]
pub highlight_results: TestResultHierarchy,
#[schemars(schema_with = "schema_as_array")]
#[serde(serialize_with = "serialize_as_array")]
pub tag_results: TestResultHierarchy,
#[schemars(schema_with = "schema_as_array")]
#[serde(serialize_with = "serialize_as_array")]
pub query_results: TestResultHierarchy,
// Data used during construction
#[schemars(skip)]
#[serde(skip)]
pub test_num: usize,
// Options passed in from the CLI which control how the summary is displayed
#[schemars(skip)]
#[serde(skip)]
pub color: bool,
#[schemars(skip)]
#[serde(skip)]
pub overview_only: bool,
#[schemars(skip)]
#[serde(skip)]
pub update: bool,
#[schemars(skip)]
#[serde(skip)]
pub json: bool,
}
@ -194,7 +206,7 @@ impl TestSummary {
}
}
#[derive(Debug, Default)]
#[derive(Debug, Default, JsonSchema)]
pub struct TestResultHierarchy {
root_group: Vec<TestResult>,
traversal_idxs: Vec<usize>,
@ -207,6 +219,10 @@ where
results.root_group.serialize(serializer)
}
fn schema_as_array(gen: &mut SchemaGenerator) -> Schema {
gen.subschema_for::<Vec<TestResult>>()
}
/// Stores arbitrarily nested parent test groups and child cases. Supports creation
/// in DFS traversal order
impl TestResultHierarchy {
@ -313,14 +329,16 @@ impl<'a> Iterator for TestResultIterWithDepth<'a> {
}
}
#[derive(Debug, Serialize)]
#[derive(Debug, Serialize, JsonSchema)]
pub struct TestResult {
pub name: String,
#[schemars(flatten)]
#[serde(flatten)]
pub info: TestInfo,
}
#[derive(Debug, Serialize)]
#[derive(Debug, Serialize, JsonSchema)]
#[schemars(untagged)]
#[serde(untagged)]
pub enum TestInfo {
Group {
@ -329,6 +347,7 @@ pub enum TestInfo {
ParseTest {
outcome: TestOutcome,
// True parse rate, adjusted parse rate
#[schemars(schema_with = "parse_rate_schema")]
#[serde(serialize_with = "serialize_parse_rates")]
parse_rate: Option<(f64, f64)>,
test_num: usize,
@ -352,7 +371,11 @@ where
}
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize)]
fn parse_rate_schema(gen: &mut SchemaGenerator) -> Schema {
gen.subschema_for::<Option<f64>>()
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, JsonSchema)]
pub enum TestOutcome {
// Parse outcomes
Passed,
@ -726,7 +749,7 @@ impl std::fmt::Display for TestDiff<'_> {
}
}
#[derive(Debug, Serialize)]
#[derive(Debug, Serialize, JsonSchema)]
pub struct TestFailure {
name: String,
actual: String,