From a06cb61fea47f6adf68df937d64571fd6fc51f3e Mon Sep 17 00:00:00 2001 From: DonislawDev Date: Tue, 22 Sep 2026 17:46:19 +0200 Subject: [PATCH 1/3] preset: upload validation, text encoding and tabular import Three presets, one PR, which is the owner's decision rather than a shortcut. They finish PR A from docs/PRESETS-PR-A-2026-09-22.md. upload-validation is 71 files in eight groups at its defaults, 120 639 488 B, measured rather than reckoned - the 195 MB in the analysis was arithmetic from parameters and this is the number the plan gives. It came down to 115 MB because far-over defaults to 2x rather than 10x: ten times the limit is the case worth having, and 100 MB of it for somebody who has just typed the command without flags is not. The owner chose that. text-encoding had to be re-cut before it could be written. Its card from 2026-09-08 describes utf-8 and utf-16 times a byte order mark times CRLF and LF on txt, md, csv and log - and that set does not exist. Asked of the registry: an encoding belongs to md, txt and xml, a line ending to csv and log, and the two have no format in common. So the set is two halves rather than one grid, and it says so, because "where is the utf-16 CSV" is the first question the file list raises. Two of its eighteen combinations are illegal and are left out with the format's own sentence: XML in utf-16 has to open with a mark, and generating it blind would refuse the whole set over a cell nobody asked for and nobody could remove. Which cells those are is asked of the format rather than written down, so the next text format with a rule of its own needs no line anywhere. tabular-import defaults to 1 000 rows by 10 columns, which packages to 1 649 371 B. Not the 200 000 from the card: that is 335 179 393 B, which is the failure PR3 stands in front of. The set a declared limit produces now exists once. size-boundaries carried it and upload-validation needed it, and PRESET-FEASIBILITY section 5 asked for the extraction with a measured gate, because the bytes of an ejected recipe reach other people's manifests as a recipe_hash. Measured either side of the move: 1298 B and 2733cf63db40465fb97e26790d668d65ea01f5e949- 27a44ddf0869399beee2bb, the same sum recorded on 2026-09-08. There is a guard on it now, so the next refactor does not need somebody to remember. --limit is declared by two presets now, on purpose - two presets asking for the number a system declares as its limit have to ask for it in the same word. Typing it without either used to be answered with one owner, in a sentence that read as certain and sent the reader who meant the other to add the wrong preset. It names every owner. Five guards, five mutations, and one line of the window's rules moved rather than copied: far-over is the first closed set any preset declares, and the preset screen asked for prose the format screen had been told not to write. Two screens drawing a field from one declaration cannot be judged by two rules without one of them being wrong. uploadvalidation.go reached 498 lines of code against a ceiling of 408 and was split by what the parts do - what the preset announces, and how the set is laid out. The depth ratchet goes from 51 to 50: the scan for a preset parameter typed without its preset became two functions when it learnt to answer with every owner. Measured, not read: every file of all three sets checked by something outside this program. Python's codecs for the twenty encoding files, byte signatures for the sixteen upload files that claim to be one thing and hold another, zipfile for the spreadsheet's 1 000 rows, and the CSV dialects read back a delimiter at a time. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 48 ++ internal/cli/preset.go | 75 ++- internal/guard/branching_test.go | 7 +- internal/guard/generatewindow_test.go | 48 +- internal/guard/parity_test.go | 16 + internal/guard/presetbytes_test.go | 64 +++ internal/guard/presetsilence_test.go | 260 +++++++++ internal/guard/presetwindow_test.go | 5 +- internal/guard/screenpixels_test.go | 20 +- internal/guard/tabularset_test.go | 146 +++++ .../testdata/screens/preset-many-settings.png | Bin 0 -> 146014 bytes .../testdata/screens/preset-many-settings.xml | 493 +++++++++++++++++ .../guard/testdata/screens/preset-menu.png | Bin 128477 -> 125804 bytes .../guard/testdata/screens/preset-menu.xml | 47 +- internal/preset/build.go | 71 +++ internal/preset/limitset.go | 165 ++++++ internal/preset/preset.go | 41 +- internal/preset/sizeboundaries.go | 130 +---- internal/preset/tabularimport.go | 310 +++++++++++ internal/preset/textencoding.go | 413 ++++++++++++++ internal/preset/uploadset.go | 511 ++++++++++++++++++ internal/preset/uploadvalidation.go | 213 ++++++++ web/content/en/site.json | 5 +- web/content/pl/site.json | 5 +- web/public/docs/index.html | 12 + web/public/pl/dokumentacja/index.html | 12 + 26 files changed, 2932 insertions(+), 185 deletions(-) create mode 100644 internal/guard/presetbytes_test.go create mode 100644 internal/guard/presetsilence_test.go create mode 100644 internal/guard/tabularset_test.go create mode 100644 internal/guard/testdata/screens/preset-many-settings.png create mode 100644 internal/guard/testdata/screens/preset-many-settings.xml create mode 100644 internal/preset/limitset.go create mode 100644 internal/preset/tabularimport.go create mode 100644 internal/preset/textencoding.go create mode 100644 internal/preset/uploadset.go create mode 100644 internal/preset/uploadvalidation.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 0070cdba..dea16f1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -195,6 +195,54 @@ because it turns other people's test suites red. ### Added +- **Three more presets: `upload-validation`, `text-encoding` and + `tabular-import`.** Run `tfg preset list` for all five, or + `tfg preset show ` for what one takes and what it would produce before + it writes anything. + + **`upload-validation`** answers "does my upload form take what it should and + turn the rest away?" - 71 files in eight groups at its defaults, 115 MB. A + file a byte under your limit, one at it, one a byte over and one twice it. A + real file of every type you allow, which is the positive control. A file for + every extension you deny, an SVG and an HTML among them, because both are + routinely taken for a picture and for plain text. A PDF named `.jpg`. A file + with no extension, one named `PHOTO.JPG` and one named `invoice.jpg.exe`. A + name 204 characters long, a name outside ASCII, and a name with spaces and + brackets that is perfectly legal. And fifty files at once. + + `--limit` is the size your form declares, and the run says out loud when you + did not give one, because a set built around our placeholder says nothing + about your form. `--allow` and `--deny` are lists with commas. An extension + in `--deny` that this build has no format for - `exe`, `sh` - still gets a + file under that name, holding plain text, and the run says so: it tests a + form reading the end of a name, not one reading what is inside. + `--far-over 10x` asks for a file ten times the limit rather than twice it, + `--far-over off` leaves it out, and `--bulk 0` leaves the mass upload out. + Anything a setting empties is named in the output rather than quietly + missing. What this set does **not** do is put a path in a file name: + `../../etc/passwd` is not a name this tool will write, deliberately. + + **`text-encoding`** answers "does my reader know which encoding a file is + in, or is it guessing?" - 20 files, 80 kB. TXT, MD and XML in UTF-8, + UTF-16LE and UTF-16BE, each with and without a byte order mark, plus CSV and + LOG with LF and with CRLF endings. UTF-8 expects `accept` with or without a + mark. UTF-16 expects `unspecified`: whether your system handles it at all is + your policy, and the manifest does not invent it. Two combinations are left + out and said out loud, because XML in UTF-16 has to open with a mark. No + format in this build carries an encoding and a line ending at once, so the + two halves are separate files rather than one grid - the run says that too. + `--sample` sets how big each file is, and refuses an odd number, because a + file in UTF-16 always has an even number of bytes. + + **`tabular-import`** answers "does my table import survive what real tools + export?" - 13 files, 2.9 MB. One CSV per dialect: comma, semicolon, pipe and + tab, LF and CRLF, with and without a header row, and three quoting styles, + one setting at a time against a base so a failure names its cause. A CSV + with more columns than a spreadsheet will show, which expects `unspecified` + with `count_limit`. A spreadsheet of `--rows` by `--columns`, written at + exactly the size that many cells package to. And the same JSON records + written indented, minified and one to a line. + - **A second preset: `empty-and-minimal`.** It answers "does a file that is valid and as small as the format allows get through?" and builds the smallest legal file of every format this build has, plus a file of nought diff --git a/internal/cli/preset.go b/internal/cli/preset.go index f2cdf5a8..99b7b8d8 100644 --- a/internal/cli/preset.go +++ b/internal/cli/preset.go @@ -9,6 +9,7 @@ import ( "sort" "strings" + "github.com/donislawdev/TestingFilesGenerator/internal/core" "github.com/donislawdev/TestingFilesGenerator/internal/engine" "github.com/donislawdev/TestingFilesGenerator/internal/format" "github.com/donislawdev/TestingFilesGenerator/internal/manifest" @@ -233,23 +234,30 @@ func presetNamed(args []string) string { // for a flag - a parse that succeeded means every name was defined. Names the // command does define are skipped for the same reason: with --preset given, // --limit is defined, and the failure was about something else entirely. -func parameterWithoutItsPreset(fs *flag.FlagSet, args []string) (name, owner string) { +func parameterWithoutItsPreset(fs *flag.FlagSet, args []string) (name string, owners []string) { for _, a := range args { if a == "--" { - return "", "" + return "", nil } - if !strings.HasPrefix(a, "-") { - continue - } - candidate, _, _ := strings.Cut(strings.TrimLeft(a, "-"), "=") - if fs.Lookup(candidate) != nil { - continue - } - if owner := preset.Declaring(candidate); owner != "" { - return candidate, owner + candidate, declared := presetParameterIn(fs, a) + if len(declared) > 0 { + return candidate, declared } } - return "", "" + return "", nil +} + +// presetParameterIn is the preset parameter one argument names, and every +// preset that declares it. +func presetParameterIn(fs *flag.FlagSet, arg string) (string, []string) { + if !strings.HasPrefix(arg, "-") { + return "", nil + } + candidate, _, _ := strings.Cut(strings.TrimLeft(arg, "-"), "=") + if fs.Lookup(candidate) != nil { + return "", nil + } + return candidate, preset.Declaring(candidate) } // addPresetFlags puts the parameters of the named preset on the generate flag @@ -281,19 +289,56 @@ func addPresetFlags(fs *flag.FlagSet, args []string, errOut io.Writer) int { // It reports whether it answered, so the caller knows whether the complaint it // held back still has to be let through. func explainUndefinedFlag(fs *flag.FlagSet, args []string, errOut io.Writer) bool { - name, owner := parameterWithoutItsPreset(fs, args) + name, owners := parameterWithoutItsPreset(fs, args) if name == "" { return false } // The second sentence names both roads, because since 2026-09-22 a // recipe file can build on the preset too - and beside a file the flag // does not exist either, the file's with section is where the value goes. + // + // Every owner is named, because since 2026-09-22 two presets ask for the + // limit a system declares and both call it that. Naming one of them sent + // the reader who meant the other to add the wrong preset, in a sentence + // that read as certain. fmt.Fprintf(errOut, - "tfg: --%s is a parameter of the preset %s, so it only exists beside it. Add --preset %s, put %s under with: in a recipe that extends it, or drop --%s.\n", - name, owner, owner, name, name) + "tfg: --%s is a parameter of %s, so it only exists beside %s. Add %s, put %s under with: in a recipe that extends %s, or drop --%s.\n", + name, presetsNamed(owners), oneOfThem(owners), presetFlagsFor(owners), + name, oneOfThem(owners), name) return true } +// presetsNamed, oneOfThem and presetFlagsFor word one sentence for one owner +// and for several, so it reads as English either way rather than as a list with +// a noun beside it that does not agree. +func presetsNamed(owners []string) string { + return core.Noun(len(owners), "the preset ", "the presets ") + joinWithOr(owners) +} + +func oneOfThem(owners []string) string { + return core.Noun(len(owners), "it", "one of them") +} + +func presetFlagsFor(owners []string) string { + flags := make([]string, 0, len(owners)) + for _, id := range owners { + flags = append(flags, "--preset "+id) + } + return joinWithOr(flags) +} + +// joinWithOr writes a list the way a sentence takes one. A comma between every +// pair reads as an enumeration and this sentence is prose. +func joinWithOr(items []string) string { + switch len(items) { + case 0: + return "" + case 1: + return items[0] + } + return strings.Join(items[:len(items)-1], ", ") + " or " + items[len(items)-1] +} + // describingFlagsBeside is describingFlagsGiven minus what this preset reads. // // A preset lays out a whole set, so a flag describing one target has no target diff --git a/internal/guard/branching_test.go b/internal/guard/branching_test.go index 9f486fd5..9a4588a5 100644 --- a/internal/guard/branching_test.go +++ b/internal/guard/branching_test.go @@ -52,7 +52,12 @@ const ( // more than the depth does. // Lowered from 52 on 2026-09-05: splitting preflight out took one function // out of the band. The ratchet only tightens. - crowdedDepthFunctions = 51 + // Lowered from 51 on 2026-09-22: the scan for a preset parameter typed + // without its preset became two functions when it learnt to answer with + // every owner, and the loop left behind is two deep rather than three. The + // four presets that arrived the same day were flattened to hold the number + // where it was - this is the one that went below it. + crowdedDepthFunctions = 50 // An axis this set does not watch. crowding() asks n >= band, so nothing // reaches it. diff --git a/internal/guard/generatewindow_test.go b/internal/guard/generatewindow_test.go index 05064a68..f837c524 100644 --- a/internal/guard/generatewindow_test.go +++ b/internal/guard/generatewindow_test.go @@ -149,24 +149,7 @@ func TestTheWindowDrawsAFieldForEveryDeclaredProperty(t *testing.T) { if bad := wrongKindOfControl(p, control); bad != "" { t.Errorf("%s.%s is %s", d.ID, p.Name, bad) } - // A closed set says what it takes with its menu rather than in - // prose, since 2026-08-19 (O105). What it still has to say is what - // it is FOR - the sentence spelling twenty format names out under - // a menu offering the same twenty was two lines of duplication on - // a screen that does not fit as it is. - want := p.Allowed() - if p.Kind == format.PropertyChoice { - want = p.Detail - } - if shown := everythingSaid(content); want != "" && !strings.Contains(shown, want) { - t.Errorf("the field for %s.%s does not say %q", d.ID, p.Name, want) - } - if p.Kind == format.PropertyChoice { - if shown := everythingSaid(content); strings.Contains(shown, p.Allowed()) { - t.Errorf("the field for %s.%s lists its values in prose (%q) as well as in the "+ - "menu above them", d.ID, p.Name, p.Allowed()) - } - } + saysWhatItTakes(t, everythingSaid(content), d.ID, p) checked++ } @@ -203,6 +186,35 @@ func declares(d format.Descriptor, name string) bool { return false } +// saysWhatItTakes checks the sentence under a field against the declaration it +// was drawn from. +// +// A closed set says what it takes with its menu rather than in prose, since +// 2026-08-19 (O105). What it still has to say is what it is FOR - the sentence +// spelling twenty format names out under a menu offering the same twenty was +// two lines of duplication on a screen that does not fit as it is. +// +// Shared with the preset screen since 2026-09-22, when the first preset +// parameter with a closed set arrived and the screen it is on asked for the +// prose the other screen had been told not to write. One rule, one place: two +// screens drawing a field from one declaration cannot be judged by two rules +// without one of them being wrong. +func saysWhatItTakes(t *testing.T, shown, owner string, p format.Property) { + t.Helper() + + want := p.Allowed() + if p.Kind == format.PropertyChoice { + want = p.Detail + } + if want != "" && !strings.Contains(shown, want) { + t.Errorf("the field for %s.%s does not say %q", owner, p.Name, want) + } + if p.Kind == format.PropertyChoice && strings.Contains(shown, p.Allowed()) { + t.Errorf("the field for %s.%s lists its values in prose (%q) as well as in the "+ + "menu above them", owner, p.Name, p.Allowed()) + } +} + // wrongKindOfControl says when a declaration got a control that cannot express // it. A closed set drawn as a box to type in is how a value gets misspelled. func wrongKindOfControl(p format.Property, control fyne.CanvasObject) string { diff --git a/internal/guard/parity_test.go b/internal/guard/parity_test.go index 3a5795f2..9d7c79df 100644 --- a/internal/guard/parity_test.go +++ b/internal/guard/parity_test.go @@ -71,6 +71,22 @@ var reachableFromTheWindow = []string{ // menu. "preset:size-boundaries.format", + // The three presets of 2026-09-22, and every parameter of each. Drawn by + // the same code as the two above, because a preset parameter IS a + // format.Property - which is what made far-over, the first closed set any + // preset has declared, arrive as a menu with no window code at all. + "preset:text-encoding", + "preset:text-encoding.sample", + "preset:tabular-import", + "preset:tabular-import.rows", + "preset:tabular-import.columns", + "preset:upload-validation", + "preset:upload-validation.limit", + "preset:upload-validation.allow", + "preset:upload-validation.deny", + "preset:upload-validation.far-over", + "preset:upload-validation.bulk", + // A recipe that builds on a preset, since 2026-09-22: the switch and the // menu on the batch screen are the extends key, and the chosen preset's // parameters under it are the with section, drawn from the declaration diff --git a/internal/guard/presetbytes_test.go b/internal/guard/presetbytes_test.go new file mode 100644 index 00000000..0a26aa1c --- /dev/null +++ b/internal/guard/presetbytes_test.go @@ -0,0 +1,64 @@ +package guard + +import ( + "crypto/sha256" + "encoding/hex" + "testing" + + _ "github.com/donislawdev/TestingFilesGenerator/internal/format/all" + "github.com/donislawdev/TestingFilesGenerator/internal/preset" +) + +// What a preset ejects is bytes somebody else's manifest remembers. +// +// The manifest carries a recipe_hash, computed from the source a run consumed, +// and a preset's source is what eject prints - the same bytes, which is the +// whole of PR5. So a tidy-up that moved a space would tell everyone holding a +// record from an earlier run that their recipe had changed, and nothing in this +// tree would have said a word. +// +// PRESET-FEASIBILITY-2026-09-08.md section 5 asked for a measured gate on +// exactly one refactor: pulling the set a declared limit produces out of +// size-boundaries so that upload-validation could use it too. The measurement +// was taken by hand on 2026-09-08 and again either side of that move on +// 2026-09-22, both times 1298 B and this sum. This is that measurement kept. +// +// What to do when it goes red: decide, rather than update. The sum moving is a +// breaking change under D11 - a major, a Breaking entry in the changelog, and +// the owner's decision, because untouchable rule 12 says the assistant does not +// raise the version. A refactor that moved it is a refactor to undo. +func TestEjectingAPresetGivesTheBytesItAlwaysGave(t *testing.T) { + pinned := []struct { + id string + args preset.Args + // bytes and sum are the whole document, measured 2026-09-08 and + // unchanged since. + bytes int + sum string + }{ + { + id: "size-boundaries", + args: preset.Args{"limit": "10mb", "format": "pdf"}, + bytes: 1298, + sum: "2733cf63db40465fb97e26790d668d65ea01f5e94927a44ddf0869399beee2bb", + }, + } + + for _, want := range pinned { + expanded, err := preset.Expand(want.id, want.args) + if err != nil { + t.Errorf("%s refused %v: %v", want.id, want.args, err) + continue + } + sum := sha256.Sum256(expanded.Source) + got := hex.EncodeToString(sum[:]) + if len(expanded.Source) == want.bytes && got == want.sum { + continue + } + t.Errorf("ejecting %s at %v gives %d B and %s, and it has given %d B and %s since "+ + "2026-09-08.\n"+ + "Every manifest written from this preset carries a hash of these bytes, so this is a "+ + "breaking change under D11 rather than a number to update here.\n%s", + want.id, want.args, len(expanded.Source), got, want.bytes, want.sum, expanded.Source) + } +} diff --git a/internal/guard/presetsilence_test.go b/internal/guard/presetsilence_test.go new file mode 100644 index 00000000..82fbe6cb --- /dev/null +++ b/internal/guard/presetsilence_test.go @@ -0,0 +1,260 @@ +package guard + +import ( + "strings" + "testing" + + "github.com/donislawdev/TestingFilesGenerator/internal/format" + _ "github.com/donislawdev/TestingFilesGenerator/internal/format/all" + "github.com/donislawdev/TestingFilesGenerator/internal/preset" + "github.com/donislawdev/TestingFilesGenerator/internal/recipe" +) + +// A preset asked for something that empties one of its groups says so. +// +// Untouchable rule 6, on the one path where it is easiest to break: nothing +// FAILS. The set expands, the run succeeds, the manifest is honest about every +// file it holds - and it holds five groups where the card describes six, +// because a parameter the caller set emptied one. A set missing a group looks +// exactly like a set that never had it, and somebody goes looking for files +// that were never going to be there. +// +// Written on 2026-09-22 with the three presets that made it reachable. Until +// then no parameter of any preset could empty anything. +func TestAGroupAPresetLeavesOutIsSaidOutLoud(t *testing.T) { + cases := []struct { + id string + args preset.Args + gone string + about string + }{ + { + id: "empty-and-minimal", args: preset.Args{"formats": "zip"}, gone: "empty", + about: "no archive has a legal empty form, so a set of archives has no empty half", + }, + { + id: "upload-validation", args: preset.Args{"bulk": "0"}, gone: "bulk-upload", + about: "nought files in the mass upload is a legal thing to ask for", + }, + { + id: "upload-validation", args: preset.Args{"allow": "jpg"}, gone: "extension-content-mismatch", + about: "one allowed type leaves nothing to name a file wrongly after", + }, + { + id: "upload-validation", args: preset.Args{"far-over": "off"}, gone: "", + about: "the file well past the limit was turned off", + }, + } + + for _, c := range cases { + t.Run(c.id+" "+c.about, func(t *testing.T) { + full := groupsOf(t, c.id, preset.Args{}) + narrowed := groupsOf(t, c.id, c.args) + + // The state this guard is about, asserted rather than assumed. + // A parameter that stopped emptying the group would leave this + // guard green while saying nothing - O118, a dozen times over. + if c.gone != "" { + if !full[c.gone] { + t.Fatalf("%s at its defaults has no group called %q, so this case is not about anything", + c.id, c.gone) + } + if narrowed[c.gone] { + t.Fatalf("%v was supposed to empty the group %q and did not", c.args, c.gone) + } + } + + // And the set says more than it does when nothing is missing. The + // sentence itself is not matched: a guard that looks for words + // pins the wording rather than the behaviour, and the wording is + // meant to improve. + said := notesOf(t, c.id, c.args) + for _, always := range notesOf(t, c.id, preset.Args{}) { + said = without(said, always) + } + if len(said) == 0 { + t.Errorf("%s asked for %v leaves something out and says nothing it does not say at its defaults", + c.id, c.args) + } + }) + } +} + +// groupsOf is every group the set holds at these values. +func groupsOf(t *testing.T, id string, args preset.Args) map[string]bool { + t.Helper() + + expanded, err := preset.Expand(id, args) + if err != nil { + t.Fatalf("%s refused %v: %v", id, args, err) + } + doc, err := recipe.Parse(expanded.Source, id+".yaml") + if err != nil { + t.Fatalf("%s wrote a recipe this build cannot read: %v", id, err) + } + out := map[string]bool{} + for _, target := range doc.Targets { + out[target.Group] = true + } + return out +} + +func notesOf(t *testing.T, id string, args preset.Args) []string { + t.Helper() + + expanded, err := preset.Expand(id, args) + if err != nil { + t.Fatalf("%s refused %v: %v", id, args, err) + } + return expanded.Notes() +} + +func without(all []string, one string) []string { + out := make([]string, 0, len(all)) + for _, said := range all { + if said != one { + out = append(out, said) + } + } + return out +} + +// The encoding set holds every combination this build can write and none of the +// ones it cannot. +// +// Both halves, because either one alone is the guard that proves nothing. A set +// that simply expanded would pass a check for "no refused cell" by holding +// three files, and a check for "every cell" would demand two that XML refuses - +// the specification says a UTF-16 entity opens with a byte order mark, and the +// format enforces it. +// +// The registry is asked which is which rather than this file knowing. The rule +// belongs to XML today, and the preset was written so that the next text format +// bringing its own rule needs no line here and none there. +func TestTheEncodingSetHoldsEveryCombinationThisBuildCanWrite(t *testing.T) { + expanded, err := preset.Expand("text-encoding", preset.Args{}) + if err != nil { + t.Fatalf("the preset refused its own defaults: %v", err) + } + doc, err := recipe.Parse(expanded.Source, "text-encoding.yaml") + if err != nil { + t.Fatalf("the preset wrote a recipe this build cannot read: %v\n%s", err, expanded.Source) + } + + held := map[string]bool{} + for _, target := range doc.Targets { + held[cellKey(target.Format, target.Properties)] = true + } + + var refused, written int + for _, desc := range format.All() { + encoding, ok := settingNamed(desc, "encoding") + if !ok { + continue + } + for _, cell := range cellsOf(desc, encoding) { + key := cellKey(desc.ID, cell) + if formatRefuses(desc, cell) { + refused++ + if held[key] { + t.Errorf("the set holds %s, which this build refuses to write", key) + } + continue + } + written++ + if !held[key] { + t.Errorf("this build writes %s and the set leaves it out", key) + } + } + } + + if refused == 0 { + t.Error("no combination of encoding and byte order mark is refused by any format in this " + + "build, so the half of this guard about what the set leaves OUT is asserting nothing") + } + if written == 0 { + t.Fatal("no combination is writable, so this guard is asserting nothing at all") + } + t.Logf("%d combination(s) written and in the set, %d refused and left out", written, refused) +} + +// cellsOf is every combination of encoding and mark one format declares. +func cellsOf(desc format.Descriptor, encoding format.Property) []map[string]string { + marks := []string{""} + if _, ok := settingNamed(desc, "bom"); ok { + marks = []string{"false", "true"} + } + var out []map[string]string + for _, name := range encoding.Choices { + for _, mark := range marks { + cell := map[string]string{"encoding": name} + if mark != "" { + cell["bom"] = mark + } + out = append(out, cell) + } + } + return out +} + +// formatRefuses asks the format itself whether it will write this combination, +// at the size the format names as its smallest for it - so an answer that comes +// back is about the settings and not about the room they need. +func formatRefuses(desc format.Descriptor, cell map[string]string) bool { + r := format.Request{Label: true, Properties: cell} + r.Bytes = desc.SmallestAccepted(r) + _, err := desc.Generator.Plan(r) + return err != nil +} + +func cellKey(id string, props map[string]string) string { + mark := props["bom"] + if mark == "" { + mark = "false" + } + return id + " " + props["encoding"] + " bom=" + mark +} + +// declaredSetting is one setting of a format as the format declares it. +func settingNamed(desc format.Descriptor, name string) (format.Property, bool) { + for _, p := range desc.Properties { + if p.Name == name { + return p, true + } + } + return format.Property{}, false +} + +// A list of formats refused for a name this build does not have says what it +// does have. +// +// The person who typed heic has no other way to find out. The refusal for a +// single format has named the list since the registry was written, and a list +// parameter is where it would be dropped without anybody noticing: the value is +// split first, so the refusal is raised by the preset rather than by +// format.Get, and a preset that worded its own sentence would say "unknown +// format" and stop. +func TestAListOfFormatsRefusedNamesWhatThisBuildHas(t *testing.T) { + lists := []struct{ id, param string }{ + {"empty-and-minimal", "formats"}, + {"upload-validation", "allow"}, + } + if len(format.IDs()) == 0 { + t.Fatal("this build registers no format, so there is no list for a refusal to name") + } + + for _, list := range lists { + _, err := preset.Expand(list.id, preset.Args{list.param: "heic"}) + if err == nil { + t.Errorf("%s took %s=heic and this build has no such format", list.id, list.param) + continue + } + for _, id := range format.IDs() { + if !strings.Contains(err.Error(), id) { + t.Errorf("%s refusing %s=heic does not name %s, which this build does have: %s", + list.id, list.param, id, err) + break + } + } + } +} diff --git a/internal/guard/presetwindow_test.go b/internal/guard/presetwindow_test.go index 8bf2415a..8fa955e6 100644 --- a/internal/guard/presetwindow_test.go +++ b/internal/guard/presetwindow_test.go @@ -198,10 +198,7 @@ func TestTheWindowDrawsAFieldForEveryPresetParameter(t *testing.T) { if bad := wrongKindOfControl(param, control); bad != "" { t.Errorf("%s.%s is %s", p.ID, param.Name, bad) } - if shown := everythingSaid(content); !strings.Contains(shown, param.Allowed()) { - t.Errorf("the field for %s.%s does not say what it takes (%q)", - p.ID, param.Name, param.Allowed()) - } + saysWhatItTakes(t, everythingSaid(content), p.ID, param) checked++ } } diff --git a/internal/guard/screenpixels_test.go b/internal/guard/screenpixels_test.go index eb39e780..4f7bf2fb 100644 --- a/internal/guard/screenpixels_test.go +++ b/internal/guard/screenpixels_test.go @@ -442,13 +442,29 @@ func screenScenes() []screenScene { // else on the form. {name: "preset-menu-setting", tab: text.TabPresets(), set: func(t *testing.T, s scene) { - // The only preset that reads a global flag, so it is the only - // one with a menu among its settings. + // The only preset that reads a GLOBAL flag, so the menu this + // opens is one drawn from preset.Global rather than from the + // preset's own declaration. upload-validation has a menu among + // its settings too since 2026-09-22 - see the screen below, + // which is where a menu the preset declares itself is looked at. menuUnder(t, s.tab, text.FieldPreset()).SetSelected("size-boundaries") }, after: func(t *testing.T, s scene) { menuUnder(t, s.tab, text.SettingLabel("format")).Tapped(&fyne.PointEvent{}) }}, + // The widest form this screen can be asked to draw: five settings, of + // four different kinds, one of them a closed set the preset declares + // itself. + // + // It is here because nobody had looked. Every preset until 2026-09-22 + // declared one setting or two, so "what does this form do with five" + // was answered by reading preset.go and finding a VScroll, which is a + // reading rather than a measurement - and UX.md section 7.0 gate 1 + // counts a state with no picture as a state nobody has seen. + {name: "preset-many-settings", tab: text.TabPresets(), + set: func(t *testing.T, s scene) { + menuUnder(t, s.tab, text.FieldPreset()).SetSelected("upload-validation") + }}, // The recipe screen, which arrived on 2026-08-18. It has states neither // of the others can be put into, and every one of them is here because a diff --git a/internal/guard/tabularset_test.go b/internal/guard/tabularset_test.go new file mode 100644 index 00000000..edbda1b3 --- /dev/null +++ b/internal/guard/tabularset_test.go @@ -0,0 +1,146 @@ +package guard + +import ( + "testing" + + "github.com/donislawdev/TestingFilesGenerator/internal/format" + _ "github.com/donislawdev/TestingFilesGenerator/internal/format/all" + "github.com/donislawdev/TestingFilesGenerator/internal/preset" + "github.com/donislawdev/TestingFilesGenerator/internal/recipe" +) + +// The table preset takes the counts the spreadsheet itself takes. +// +// It has to declare them rather than read them: a preset is registered at init +// and the format registry has not necessarily finished filling by then, which +// is why preset.Global reads the formats when it is called instead. So the +// range is written down, and a written down number goes stale green. This is +// the thing that reddens instead. +// +// What it protects: a field on a screen and a refusal on the command line, both +// built from the declaration. A preset offering "1 to 200000 rows" beside a +// build whose sheet stops at 50000 would take the value, draw the field, refuse +// the run - and blame the sheet for a range this preset had promised. +func TestTheTabularPresetTakesTheRangesTheSheetDeclares(t *testing.T) { + sheet, err := format.Get("xlsx") + if err != nil { + t.Fatalf("this build has no spreadsheet, so the preset built on one cannot be checked: %v", err) + } + p, err := preset.Get("tabular-import") + if err != nil { + t.Fatalf("this build has no tabular-import preset: %v", err) + } + + checked := 0 + for _, param := range p.Parameters { + declared, ok := settingNamed(sheet, param.Name) + if !ok { + t.Errorf("the preset declares a parameter called %q and the spreadsheet has no such "+ + "setting, so nothing says what its range should be", param.Name) + continue + } + if param.Min != declared.Min || param.Max != declared.Max { + t.Errorf("the preset takes %s from %d to %d and the spreadsheet takes %d to %d - "+ + "the field and the refusal are built from the first and the run is judged by the second", + param.Name, param.Min, param.Max, declared.Min, declared.Max) + } + if param.Unit != declared.Unit { + t.Errorf("the preset counts %s in %q and the spreadsheet counts it in %q", + param.Name, param.Unit, declared.Unit) + } + checked++ + } + if checked == 0 { + t.Fatal("no parameter was compared - this guard would pass against any range ever written") + } + t.Logf("%d parameter(s) with the range the spreadsheet declares", checked) +} + +// Every dialect the table format declares is in the set. +// +// The group is built by walking what CSV declares rather than by a list written +// in the preset, and this is what holds that true from the other side: a fifth +// dialect setting has to arrive in the set without anybody adding it, and one +// that stopped arriving has to redden. +// +// One file per value, minus the one the base already stands for. The base is a +// file of its own holding every setting at its default, so the count is exact +// rather than a lower bound: a set where one axis quietly produced nothing +// would still hold files for the others and still look like a set. +// +// What it does NOT check is which of those files expect accept and which say +// the answer is the reader's policy. That line is drawn in the preset, by a +// standard rather than by the registry - RFC 4180 asks for CRLF and for +// quoting, and no registry knows that. +func TestEveryDialectTheTableDeclaresIsInTheSet(t *testing.T) { + csv, err := format.Get("csv") + if err != nil { + t.Fatalf("this build has no csv, so the dialect half of this set cannot be checked: %v", err) + } + expanded, err := preset.Expand("tabular-import", preset.Args{}) + if err != nil { + t.Fatalf("the preset refused its own defaults: %v", err) + } + doc, err := recipe.Parse(expanded.Source, "tabular-import.yaml") + if err != nil { + t.Fatalf("the preset wrote a recipe this build cannot read: %v\n%s", err, expanded.Source) + } + + dialects := targetsInGroup(doc, "csv-dialects") + if len(dialects) == 0 { + t.Fatal("the set holds no dialect group at all, so this guard is asserting nothing") + } + + axes := 0 + wanted := 1 // the base, which stands for every setting at its default + for _, p := range csv.Properties { + if p.Kind != format.PropertyChoice && p.Kind != format.PropertyBool { + continue + } + axes++ + wanted += len(valuesOfSetting(p)) - 1 + assertAxisIsVaried(t, dialects, p) + } + if axes == 0 { + t.Fatal("csv declares no setting that names a shape, so there is no dialect to vary") + } + if len(dialects) != wanted { + t.Errorf("the dialect group holds %d files and %d setting(s) with their values come to %d", + len(dialects), axes, wanted) + } + t.Logf("%d dialect file(s) across %d setting(s)", len(dialects), axes) +} + +// assertAxisIsVaried checks that every value of one setting appears somewhere in +// the group, the default included - it is the base that carries that one. +func assertAxisIsVaried(t *testing.T, dialects []recipe.Target, p format.Property) { + t.Helper() + + seen := map[string]bool{} + for _, target := range dialects { + seen[target.Properties[p.Name]] = true + } + for _, value := range valuesOfSetting(p) { + if !seen[value] { + t.Errorf("csv takes %s=%s and no file of the dialect group is written that way", + p.Name, value) + } + } +} + +func valuesOfSetting(p format.Property) []string { + if p.Kind == format.PropertyBool { + return []string{"false", "true"} + } + return p.Choices +} + +func targetsInGroup(doc *recipe.Recipe, group string) []recipe.Target { + var out []recipe.Target + for _, target := range doc.Targets { + if target.Group == group { + out = append(out, target) + } + } + return out +} diff --git a/internal/guard/testdata/screens/preset-many-settings.png b/internal/guard/testdata/screens/preset-many-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..070d9bc30f31d86812792ee82ce73b71ea7333da GIT binary patch literal 146014 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

;&YAKt9t?7J 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 + + + + + + + + + + Single batch + + + + + Presets + + + + + Several batches + + + + + About + + + + + + + + + + + + + + + + + Presets + + + + + + + + + Ready-made sets of files, each built to answer one question about the system under test. + + + + + + + + + + + The question + + + + Preset + + + + + + + + + + + + + upload-validation + + + + + + + + + + + + + + + + Does my upload form take what it should and turn the rest away? + + + + + + + + + Typically finds: + + + + + + + + + + + a limit enforced in the browser and not on the server + + + + + • + + + + + + + an SVG or an HTML file taken for a picture or for plain text, which is a way to get a script past a form + + + + + • + + + + + + + a file checked by its extension and never opened, so a PDF named .jpg goes through + + + + + • + + + + + + + a form that reads the whole body into memory before it looks at how big it is + + + + + • + + + + + + + an upload named PHOTO.JPG turned away where photo.jpg is taken, or the other way round + + + + + • + + + + + + + a name with spaces, brackets or characters outside ASCII written to disk unchanged + + + + + • + + + + + + + + + + + Settings + + + + + Limit + + + + + + + + + + + + + + + 10mb + + + + + + + + + + + + + + + + + + + + + + + + + Allow + + + + + + + + + + + + + + + jpg,png,pdf + + + + + + + + + + + + + + + + Deny + + + + + + + + + + + + + + + svg,html,exe,sh + + + + + + + + + + + + + + + + Far-over + + + + + + + + + + + + + 2x + + + + + + + + + + + + + + Bulk + + + + + + + + + + + + + + + 50 + + + + + + + + + + + + + + + + + + + + + Output + + + + Output directory + + * + + + + + + + + + + + + + + + + /tfg/out + + + + + + + + Choose... + + + + + + + + + + Seed + + * + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + Preview + + + + + Generate + + + + + + + + + + + 71 files · 115.1 MB (120 639 488 B) · html, jpg, pdf, png, svg, txt · will go to /tfg/out + + + + + + + + + + + + + + + + Donate + + + + + + + + + + + + + diff --git a/internal/guard/testdata/screens/preset-menu.png b/internal/guard/testdata/screens/preset-menu.png index 1c2fa78f254ecd2305fbc2bead17e7445a6a6064..862eaa7e256e50a54d311afd543fcb9013096d41 100644 GIT binary patch delta 76890 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 MU%sZAuY5D`--6oAga7~l delta 79614 zcmc$_WmH|kvM#!CLI@!Q*A+r=hv4pR!3j=qcb_-`f-c+%0fIXOw*bN2J-EBuo%`&) z?|%2(GsgSze!SU?UQILTRn=Wx@>R`)X_TdXl!~|nAO+>4OS#WOpDPCPhZj2SsTDO) zM(Xfvm7g_G5%B}7TCp`8y&P)w(sDGs8of=|gGnCs-cpjw@XaFKMePNP;u>LP#NYjt zv@x@Km@!K+F+L5jAXuZ$_Hx4)kJe}){ro;-g`3JSz0a(5&@1Osl?K7ab; zB=v_KH-aXKPS0cWOYWGal9HybuBe(Fv4EHBH>Dd9S=oIc_+`?ds6ko6Zv*DeuC9m2 z-m%?_MxMR~CqawaE!&Hic&%z$S|2UO#rzE>r%TB~gXF%jrXV2&CuSZErm(&5`9@GW zW-cRJo|y0`LLj!7oSXvRLEZ2c`}Em-9zCjsLl;^@WvP0Y^={OszX=O7?48 zL-Q9G^^XtUa6(Z0&GqxRTG(R-@6a?ro4~{69{%Oc>_RoC?cm>YT_(Ne#i^-`*wbg@ z-aF-b?{DPfoxvi8%F1C9xkJNx+q*RE?@=S`To3yTKNWm#@hmMEVuQ3Jis#zev$mcP*{gXz;w`70GEIw@B7(6X;r4I6vE@b8O(_=8n}y zD=d^|VNu4xQTy=W%clZl2EFF5p1*HC$l|i$U!0xEKu)f%F0QVsTBr7==mG)}%0D;I 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

NJ3hz9QH+!%gCgEH~oN6T95BG*EgYq~zinA} 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 n+`m6Doc;6lo%G}HUy09&o - - - - - - - - - - + + + + + + + + + + @@ -363,12 +363,39 @@ size-boundaries + + + + tabular-import + + + + + + text-encoding + + + + + + upload-validation + + + + + + + + + + + diff --git a/internal/preset/build.go b/internal/preset/build.go index 420ed9b3..46eaafbb 100644 --- a/internal/preset/build.go +++ b/internal/preset/build.go @@ -2,6 +2,7 @@ package preset import ( "fmt" + "strconv" "strings" "github.com/donislawdev/TestingFilesGenerator/internal/format" @@ -131,6 +132,76 @@ func knownFormat(item string) string { // lower is the keep for a list of names the registry spells in lower case. func lower(item string) string { return strings.ToLower(item) } +// setFile is one file of a preset's set: which format writes it, what it is +// called, what settings make it what it is, and what a reasonably built system +// should do with it. +// +// Shared because two presets lay their sets out this way and a third is the +// point at which a shape becomes a type. What it is NOT is every file of every +// preset: the minimal set and the encoding set each name their files from one +// varying part and compute the rest, which is a rule of their own rather than a +// field here. +type setFile struct { + id, name, group string + desc format.Descriptor + props map[string]string + // count is how many files this one entry stands for. Nought and one both + // mean a single file, because a set with one of something says "1" and a + // set with none of it leaves the entry out entirely. + count int + size int64 + // atFloor asks for the smallest size this format takes for these settings, + // whatever that turns out to be. A separate field rather than a nought in + // size, because nought is a real size and a file of no bytes is a case two + // of these presets are about - the sentinel that collides with a legal + // value is how a guard ends up testing the wrong thing. + atFloor bool + expected, reason string +} + +// bytes is the size this file is asked for. +func (f setFile) bytes() int64 { + if f.atFloor { + return f.desc.SmallestAccepted(format.Request{Label: true, Properties: f.props}) + } + return f.size +} + +// refused is what the format says about this file before anything is written, +// or nil when it will produce it. +// +// Every set built from setFile asks this of every file it holds, which is PR7 +// one level down: a set missing the three files the run was about still looks +// like a set. +func (f setFile) refused() error { + r := format.Request{Label: true, Properties: f.props} + r.Bytes = f.bytes() + _, err := f.desc.Generator.Plan(r) + return err +} + +func (f setFile) draft() recipe.TargetDraft { + count := "1" + if f.count > 1 { + count = strconv.Itoa(f.count) + } + return recipe.TargetDraft{ + ID: f.id, Format: f.desc.ID, Count: count, + Size: strconv.FormatInt(f.bytes(), 10), Name: f.name, Group: f.group, + Expected: f.expected, ExpectedReason: f.reason, + Properties: f.props, + } +} + +// draftsOf is a whole set as targets, ready for the composer. +func draftsOf(files []setFile) []recipe.TargetDraft { + out := make([]recipe.TargetDraft, 0, len(files)) + for _, f := range files { + out = append(out, f.draft()) + } + return out +} + // plan is the set a preset lays out, ready to be written. // // A preset describes targets and this turns them into source. PR5 asks for diff --git a/internal/preset/limitset.go b/internal/preset/limitset.go new file mode 100644 index 00000000..2c3d229b --- /dev/null +++ b/internal/preset/limitset.go @@ -0,0 +1,165 @@ +package preset + +import ( + "fmt" + "strconv" + "strings" + + "github.com/donislawdev/TestingFilesGenerator/internal/format" + "github.com/donislawdev/TestingFilesGenerator/internal/recipe" +) + +// The set a declared limit produces: the limit itself, and one file either +// side of it for every distance asked for. +// +// It lives on its own because two presets lay it out. size-boundaries is a +// microscope on this one axis and reaches as far either side as it is told. +// upload-validation is a survey across many axes, of which size is one, and +// takes a single step either side plus one file well past the limit - the +// verdict of PRESET-FEASIBILITY-2026-09-08.md section 5, where the alternative +// was two presets doing literally the same thing. +// +// The sentence "under the limit is accepted, over it is refused for size_limit" +// then exists once. Writing it twice is what the same document calls an +// invitation for the two to drift, and the drift would be invisible: both sets +// would still run, still verify, and disagree about what a limit means. +// +// D11 gate on the extraction, measured 2026-09-22: eject size-boundaries at its +// defaults gives 1298 B and the same sha256 recorded on 2026-09-08, because the +// bytes of an ejected recipe reach other people's manifests as a recipe_hash. + +// offset is one step either side of the limit, with the text it was written as +// so the files can name themselves after it. +type offset struct { + text string + bytes int64 +} + +// step is one file of the set: how big, what it is called, and what a +// reasonably built system should do with it. +type step struct { + id string + size int64 + accept bool +} + +// limitSet is a declared limit and everything needed to lay files out around it. +type limitSet struct { + // preset and setting name what a refusal is about: which preset could not + // build the set, and which of its parameters a window should mark. + preset, setting string + // group is what the files call themselves collectively in the manifest, so + // a test can assert on the whole class at once. + group string + desc format.Descriptor + limit int64 + // limitText is the limit as it was typed. It leads every file name, so two + // sets built around different limits cannot be told apart only by opening + // the files - reported from use on 2026-08-11, where a directory holding + // two runs was a directory of guesses. + limitText string + spread []offset +} + +// steps lays the set out, largest distance below the limit first, then the +// limit, then upward. The order is the order somebody reads a table in. +func (s limitSet) steps() []step { + out := make([]step, 0, 2*len(s.spread)+1) + for i := len(s.spread) - 1; i >= 0; i-- { + out = append(out, step{ + id: "under_" + s.spread[i].text, size: s.limit - s.spread[i].bytes, accept: true, + }) + } + out = append(out, step{id: "at_limit", size: s.limit, accept: true}) + for _, o := range s.spread { + out = append(out, step{id: "over_" + o.text, size: s.limit + o.bytes, accept: false}) + } + return out +} + +// reachable refuses the whole set when any one file of it is out of reach. +// +// PR7, and the untouchable rule about silence. A set missing three of its seven +// files still looks like a set, and the three that are missing are the ones the +// run was about - the ones nearest the limit. +func (s limitSet) reachable(set []step) error { + floor := s.desc.SmallestAccepted(format.Request{Seed: 1, Label: true}) + for _, one := range set { + if one.size >= floor { + continue + } + what := fmt.Sprintf("%s would be %d B and the smallest %s this build makes is %d B", + one.id, one.size, strings.ToUpper(s.desc.ID), floor) + if one.size <= 0 { + what = fmt.Sprintf("%s would be %d B, and a file cannot be smaller than nothing", one.id, one.size) + } + return &ImpossibleError{ + Preset: s.preset, + // The limit rather than the spread, although the sentence offers + // both ways out. The limit is the one number the set is measured + // from, so it is where somebody types first - and a message can + // only stand beside one box. + Setting: s.setting, + Detail: what, + Hint: fmt.Sprintf( + // The settings are named without a leading dash on purpose. This + // sentence is built in the engine and both surfaces show it word + // for word, so a spelling only one of them has sends the other's + // reader translating: the window labels these fields "limit" and + // "spread", and there is no "--limit" anywhere on it. Seen on + // screen 2026-08-11, O79. + "Raise the {setting} above %d B, narrow the spread, or choose a format with a smaller minimum. The {setting} asked for was %d B.", + floor+deepest(set, s.limit), s.limit), + } + } + return nil +} + +// deepest is how far below the limit the set reaches, so the hint can name a +// limit that would work rather than only the one that did not. +func deepest(set []step, limit int64) int64 { + var found int64 + for _, one := range set { + if d := limit - one.size; d > found { + found = d + } + } + return found +} + +// drafts is the set as targets, ready for the composer. +// +// This used to print the document itself, line by line, with a comment saying +// that was safe because every value was one the package built itself. The +// comment was wrong until 2026-08-05: the id carries the caller's own text, so +// "1\rB" reached the document raw and broke it, because the size parser trims +// the ends and that carriage return sat in the middle. Found by fuzzing rather +// than by reading. +// +// parseSpread refuses that character now, and this no longer writes YAML at +// all - plan.source hands the values to the marshaller, which does the quoting +// and owns the shape of the document. Two defences rather than one, and the +// second one cannot be forgotten by the next preset. +func (s limitSet) drafts(set []step) []recipe.TargetDraft { + out := make([]recipe.TargetDraft, 0, len(set)) + for _, one := range set { + draft := recipe.TargetDraft{ + ID: one.id, + Format: s.desc.ID, + Count: "1", + Size: strconv.FormatInt(one.size, 10), + // The id stays as it was. It derives the seed, so putting the limit + // in it would move the bytes of every file in this set for a change + // that is about telling two directories apart. + Name: s.limitText + "_" + one.id + s.desc.Extension, + Group: s.group, + Expected: "accept", + } + if !one.accept { + draft.Expected = "reject" + draft.ExpectedReason = "size_limit" + } + out = append(out, draft) + } + return out +} diff --git a/internal/preset/preset.go b/internal/preset/preset.go index d63ef1da..bffa17b4 100644 --- a/internal/preset/preset.go +++ b/internal/preset/preset.go @@ -313,9 +313,16 @@ func (e *ImpossibleError) InTheWordsOf(name string) string { if name == "" { name = e.Setting } - return core.InTheWordsOf( - fmt.Sprintf("the preset %s cannot build this set - %s. %s", e.Preset, e.Detail, e.Hint), - name) + said := fmt.Sprintf("the preset %s cannot build this set - %s", e.Preset, e.Detail) + // A refusal that came up from the registry already ends with what to do + // about it, and a second sentence after that one is worse than no second + // sentence: "Ask for fewer rows or fewer columns. Ask for a set the rows + // can carry" is the tool saying the same thing twice and vaguer the second + // time. Seen on 2026-09-22 while the tabular set was being wired up. + if e.Hint == "" { + return core.InTheWordsOf(said+".", name) + } + return core.InTheWordsOf(said+". "+e.Hint, name) } // AboutSetting lets a window put this message beside the box that caused it, @@ -410,22 +417,36 @@ func IDs() []string { return ids() } -// Declaring is the preset that declares a parameter of this name, or empty. +// Declaring is every preset that declares a parameter of this name, by id. // // Parameter names and global flag names share one namespace, which is what // lets "--preset size-boundaries --limit 10mb" read as one sentence. The cost // of that is a flag which exists in one invocation and not in the next, so // typing --limit without its preset has to be answered with something better // than "not defined". This is how the command line finds out whose it is. -func Declaring(name string) string { +// +// Every owner rather than the first, since 2026-09-22. Two presets ask for the +// number a system declares as its limit and both call it limit - deliberately, +// because a reader who learns one word and types it at the other has learnt the +// right word. Answering with only the first left that reader pointed at the +// preset they were not using, with a sentence that read as certain. +func Declaring(name string) []string { + var out []string for _, id := range ids() { - for _, param := range registry[id].Parameters { - if param.Name == name { - return id - } + if declares(registry[id], name) { + out = append(out, id) } } - return "" + return out +} + +func declares(p Preset, name string) bool { + for _, param := range p.Parameters { + if param.Name == name { + return true + } + } + return false } func ids() []string { diff --git a/internal/preset/sizeboundaries.go b/internal/preset/sizeboundaries.go index 0b2ca88f..061d9348 100644 --- a/internal/preset/sizeboundaries.go +++ b/internal/preset/sizeboundaries.go @@ -2,12 +2,10 @@ package preset import ( "fmt" - "strconv" "strings" "github.com/donislawdev/TestingFilesGenerator/internal/core" "github.com/donislawdev/TestingFilesGenerator/internal/format" - "github.com/donislawdev/TestingFilesGenerator/internal/recipe" ) const ( @@ -59,13 +57,6 @@ func init() { }) } -// offset is one step either side of the limit, with the text it was written as -// so the files can name themselves after it. -type offset struct { - text string - bytes int64 -} - // spreadList is how the distances either side of the limit are written. // // The shared parser does the splitting, the duplicate and the refusal, and this @@ -160,30 +151,6 @@ func parseSpread(raw string) ([]offset, error) { return out, nil } -// step is one file of the set: how big, what it is called, and what a -// reasonably built system should do with it. -type step struct { - id string - size int64 - accept bool -} - -// steps lays the set out, largest distance below the limit first, then the -// limit, then upward. The order is the order somebody reads a table in. -func steps(limit int64, spread []offset) []step { - out := make([]step, 0, 2*len(spread)+1) - for i := len(spread) - 1; i >= 0; i-- { - out = append(out, step{ - id: "under_" + spread[i].text, size: limit - spread[i].bytes, accept: true, - }) - } - out = append(out, step{id: "at_limit", size: limit, accept: true}) - for _, o := range spread { - out = append(out, step{id: "over_" + o.text, size: limit + o.bytes, accept: false}) - } - return out -} - func expandSizeBoundaries(args Args) ([]byte, error) { limit, err := core.ParseSize(args["limit"]) if err != nil { @@ -233,100 +200,17 @@ func expandSizeBoundaries(args Args) ([]byte, error) { } } - set := steps(limit, spread) - if err := reachable(set, desc, limit); err != nil { + around := limitSet{ + preset: boundariesID, setting: "limit", group: boundariesID, + desc: desc, limit: limit, limitText: limitText, spread: spread, + } + set := around.steps() + if err := around.reachable(set); err != nil { return nil, err } return plan{ preset: boundariesID, question: boundariesQuestion, - targets: draftsOfSteps(set, desc, limitText), + targets: around.drafts(set), }.source() } - -// reachable refuses the whole set when any one file of it is out of reach. -// -// PR7, and the untouchable rule about silence. A set missing three of its seven -// files still looks like a set, and the three that are missing are the ones the -// run was about - the ones nearest the limit. -func reachable(plan []step, desc format.Descriptor, limit int64) error { - floor := desc.SmallestAccepted(format.Request{Seed: 1, Label: true}) - for _, s := range plan { - if s.size >= floor { - continue - } - what := fmt.Sprintf("%s would be %d B and the smallest %s this build makes is %d B", - s.id, s.size, strings.ToUpper(desc.ID), floor) - if s.size <= 0 { - what = fmt.Sprintf("%s would be %d B, and a file cannot be smaller than nothing", s.id, s.size) - } - return &ImpossibleError{ - Preset: boundariesID, - // The limit rather than the spread, although the sentence offers - // both ways out. The limit is the one number the set is measured - // from, so it is where somebody types first - and a message can - // only stand beside one box. - Setting: "limit", - Detail: what, - Hint: fmt.Sprintf( - // The settings are named without a leading dash on purpose. This - // sentence is built in the engine and both surfaces show it word - // for word, so a spelling only one of them has sends the other's - // reader translating: the window labels these fields "limit" and - // "spread", and there is no "--limit" anywhere on it. Seen on - // screen 2026-08-11, O79. - "Raise the {setting} above %d B, narrow the spread, or choose a format with a smaller minimum. The {setting} asked for was %d B.", - floor+largest(plan, limit), limit), - } - } - return nil -} - -// largest is how far below the limit the set reaches, so the hint can name a -// limit that would work rather than only the one that did not. -func largest(plan []step, limit int64) int64 { - var deepest int64 - for _, s := range plan { - if d := limit - s.size; d > deepest { - deepest = d - } - } - return deepest -} - -// draftsOfSteps is the set as targets, ready for the composer. -// -// This used to print the document itself, line by line, with a comment saying -// that was safe because every value was one the package built itself. The -// comment was wrong until 2026-08-05: the id carries the caller's own text, so -// "1\rB" reached the document raw and broke it, because the size parser trims -// the ends and that carriage return sat in the middle. Found by fuzzing rather -// than by reading. -// -// parseSpread refuses that character now, and this no longer writes YAML at -// all - plan.source hands the values to the marshaller, which does the quoting -// and owns the shape of the document. Two defences rather than one, and the -// second one cannot be forgotten by the next preset. -func draftsOfSteps(set []step, desc format.Descriptor, limitText string) []recipe.TargetDraft { - out := make([]recipe.TargetDraft, 0, len(set)) - for _, s := range set { - draft := recipe.TargetDraft{ - ID: s.id, - Format: desc.ID, - Count: "1", - Size: strconv.FormatInt(s.size, 10), - // The id stays as it was. It derives the seed, so putting the limit - // in it would move the bytes of every file in this set for a change - // that is about telling two directories apart. - Name: limitText + "_" + s.id + desc.Extension, - Group: boundariesID, - Expected: "accept", - } - if !s.accept { - draft.Expected = "reject" - draft.ExpectedReason = "size_limit" - } - out = append(out, draft) - } - return out -} diff --git a/internal/preset/tabularimport.go b/internal/preset/tabularimport.go new file mode 100644 index 00000000..9e943e18 --- /dev/null +++ b/internal/preset/tabularimport.go @@ -0,0 +1,310 @@ +package preset + +import ( + "strconv" + "strings" + + "github.com/donislawdev/TestingFilesGenerator/internal/format" +) + +const ( + tabularID = "tabular-import" + + rowsParam = "rows" + columnsParam = "columns" + defaultRows = "1000" + defaultColumns = "10" + + // The ranges the spreadsheet declares, written here because a preset is + // registered at init and the format registry has not necessarily finished + // filling by then - the same reason Global() reads the formats when it is + // called rather than when it is declared. + // + // A number copied by hand goes stale green, so this pair is not left to + // care: TestTheTabularPresetTakesTheRangesTheSheetDeclares asks the + // registry and reddens when they drift. + sheetRowsMax = 200000 + sheetColumnsMax = 32768 + + dialectGroup = "csv-dialects" + wideGroup = "csv-wide" + sheetGroup = "xlsx-rows" + layoutGroup = "json-layouts" + + // tableSample is how big the files that are about SHAPE rather than size + // are - the dialects and the layouts. Big enough to hold hundreds of rows, + // so a reader that copes with the first row and not the hundredth is + // caught, and small enough that eleven of them are noise beside the + // spreadsheet. + tableSample = 64 << 10 + + // The settings this set varies, spelled here because no package owns these + // names the way textenc owns the encoding. What keeps them honest is the + // registry: the axes are read from what CSV declares, and these are only + // used to say which of them is a matter of policy. + csvDelimiter = "delimiter" + csvHeader = "header" + csvQuoteStyle = "quote_style" + jsonFormat = "formatting" + + // tabularQuestion is announced by the preset AND written into the header of + // an ejected recipe. Named once rather than typed twice. + tabularQuestion = "Does my table import survive what real tools export?" +) + +func init() { + Register(Preset{ + ID: tabularID, + Title: "Tabular import", + Question: tabularQuestion, + + Parameters: []format.Property{ + { + Name: rowsParam, Kind: format.PropertyInt, + Min: 1, Max: sheetRowsMax, Unit: "rows", + Default: defaultRows, + Detail: "How many rows the spreadsheet holds. It is written at exactly the size " + + "that many rows package to, so the budget above moves with this.", + }, + { + Name: columnsParam, Kind: format.PropertyInt, + Min: 1, Max: sheetColumnsMax, Unit: "columns", + Default: defaultColumns, + Detail: "How many columns each row of the spreadsheet has. Rows times columns " + + "has a ceiling, and asking past it is refused before anything is written.", + }, + }, + + Requires: []string{"MVP"}, + Catches: []string{ + "a semicolon file read as one column, because the delimiter was assumed rather than looked for", + "a CRLF file split into rows with an empty row after each one", + "a headerless table whose first row of data is eaten as column names", + "an import that keeps the columns it can show and drops the rest without a word", + "a reader that takes JSON records one line at a time and stops at the first indented document", + }, + + Expand: expandTabularImport, + }) +} + +// dialectPolicy says whether changing one CSV setting produces a file any +// reader that takes CSV has to cope with, or a file whose acceptance is that +// reader's own policy. +// +// The line is drawn where a standard draws it. RFC 4180 asks for CRLF and for +// quoting, so a reader that breaks on either has a defect rather than a policy. +// A semicolon file is what a European spreadsheet exports and it is a different +// dialect - a reader that takes commas only and says so is a correct reader, +// and MF5 forbids inventing the answer for it. A table with no header row is +// the same kind of question. +// +// Every axis CSV declares reaches the set whether or not it is named here - +// TestEveryDialectTheTableDeclaresIsInTheSet asks the registry for that. What +// an axis missing from this map loses is the stronger half of its verdict: it +// lands on the policy side and says "your call" where it might have said "this +// has to work". A weaker claim rather than a wrong one, which is the right way +// round for a default nobody chose. +var dialectPolicy = map[string]bool{ + lineEndingSetting: false, + csvQuoteStyle: false, + csvDelimiter: true, + csvHeader: true, +} + +// dialectFiles is the base table and one file for every other value of every +// setting CSV varies by. +// +// One axis at a time rather than the product, and that is the whole design of +// this group. Four delimiters times two line endings times two headers times +// three quote styles is forty eight files that say LESS than eight, because a +// failure in one of them names no cause. Eight files name one setting each. +// +// The base is a file of its own rather than four files restating it. Every +// setting at its declared default appears once, under the name default, and +// each of the other seven differs from it in exactly one place. +func dialectFiles(csv format.Descriptor) []setFile { + base := map[string]string{} + for _, axis := range dialectAxes(csv) { + base[axis.Name] = axis.Default + } + out := []setFile{{ + id: "dialect_default", name: "default.csv", group: dialectGroup, + desc: csv, props: base, size: tableSample, expected: "accept", + }} + + for _, axis := range dialectAxes(csv) { + out = append(out, dialectVariants(csv, base, axis)...) + } + return out +} + +// dialectVariants is one file for every value of one setting except the one the +// base already stands for. +func dialectVariants(csv format.Descriptor, base map[string]string, axis format.Property) []setFile { + var out []setFile + for _, value := range valuesOf(axis) { + if value == axis.Default { + continue + } + file := setFile{ + id: "dialect_" + axis.Name + "_" + value, + name: axis.Name + "_" + value + ".csv", + group: dialectGroup, desc: csv, props: besides(base, axis.Name, value), + size: tableSample, expected: "accept", + } + if dialectPolicy[axis.Name] { + file.expected, file.reason = "unspecified", "none" + } + out = append(out, file) + } + return out +} + +// besides is the base settings with one of them changed, leaving the base as +// it was. Every file of the group differs from it in exactly one place, so the +// copy is what keeps that true. +func besides(base map[string]string, name, value string) map[string]string { + out := make(map[string]string, len(base)) + for k, v := range base { + out[k] = v + } + out[name] = value + return out +} + +// dialectAxes is every setting of a format that names a shape rather than a +// size, in the order the format declares them. +// +// Read from the registry, so a fifth dialect setting joins the set without a +// line changing here. The whole numbers are left out because they are counts +// rather than dialects, and the one that matters has a group of its own. +func dialectAxes(desc format.Descriptor) []format.Property { + var out []format.Property + for _, p := range desc.Properties { + if p.Kind == format.PropertyChoice || p.Kind == format.PropertyBool { + out = append(out, p) + } + } + return out +} + +// valuesOf is what one setting can be, for a choice and for a switch. +func valuesOf(p format.Property) []string { + if p.Kind == format.PropertyBool { + return []string{"false", "true"} + } + return p.Choices +} + +// wideFile is the table with more columns than a spreadsheet will show. +// +// The count is the most this build writes rather than a number chosen here, +// because the registry is the only place that knows it and the file is about +// the ceiling. Its size is whatever that many columns need, so this one file +// sets the floor of the whole set and cannot be made smaller. +func wideFile(csv format.Descriptor) setFile { + columns, _ := declared(csv, columnsParam) + return setFile{ + id: "wide_table", name: "wide.csv", group: wideGroup, desc: csv, + props: map[string]string{columnsParam: strconv.FormatInt(columns.Max, 10)}, + atFloor: true, + // A spreadsheet shows what it can show and drops the rest without + // saying so. Whether an import should refuse such a table, truncate it + // or take it whole is its owner's decision, so this is a position + // rather than a promise - MF5. + expected: "unspecified", reason: "count_limit", + } +} + +// sheetFile is the spreadsheet at the row and column counts asked for. +func sheetFile(xlsx format.Descriptor, rows, columns string) setFile { + return setFile{ + id: "sheet", name: "sheet.xlsx", group: sheetGroup, desc: xlsx, + props: map[string]string{rowsParam: rows, columnsParam: columns}, + atFloor: true, + expected: "accept", + } +} + +// layoutFiles is the same records written the three ways a document can be +// laid out. +// +// All three are accepted by every JSON reader - the format says so in its own +// declaration - so this group is stated rather than left open. What it finds is +// a consumer that is not a JSON reader at all but a loop over lines. +func layoutFiles(js format.Descriptor) []setFile { + layout, ok := declared(js, jsonFormat) + if !ok { + return nil + } + out := make([]setFile, 0, len(layout.Choices)) + for _, value := range layout.Choices { + out = append(out, setFile{ + id: "layout_" + strings.ReplaceAll(value, "-", "_"), + name: value + ".json", group: layoutGroup, desc: js, + props: map[string]string{jsonFormat: value}, + size: tableSample, expected: "accept", + }) + } + return out +} + +// refusedTable turns a refusal from the registry into one about the setting +// somebody typed. +// +// The sheet refuses rows times columns above its ceiling, and the sentence it +// writes is the right one - it names both counts, the limit and why there is +// one. What it cannot know is that those two numbers came from parameters of a +// preset rather than from a recipe, so this is where the refusal learns which +// box to stand beside. +func refusedTable(f setFile) error { + err := f.refused() + if err == nil { + return nil + } + return &ImpossibleError{ + Preset: tabularID, + Setting: settingBehind(f), + // No hint of our own. The sheet's refusal ends with what to do about it + // and says it better than a general sentence could, because it knows + // which of the two counts it was and by how much. + Detail: strings.TrimPrefix(err.Error(), f.desc.ID+": "), + } +} + +// settingBehind is the parameter a file of this set was built from, so a +// refusal can stand beside the box that caused it. Empty where the file is +// built from no parameter at all. +func settingBehind(f setFile) string { + if f.group == sheetGroup { + return rowsParam + } + return "" +} + +func expandTabularImport(args Args) ([]byte, error) { + csv, err := format.Get("csv") + if err != nil { + return nil, err + } + xlsx, err := format.Get("xlsx") + if err != nil { + return nil, err + } + js, err := format.Get("json") + if err != nil { + return nil, err + } + + files := dialectFiles(csv) + files = append(files, wideFile(csv), sheetFile(xlsx, args[rowsParam], args[columnsParam])) + files = append(files, layoutFiles(js)...) + + for _, f := range files { + if err := refusedTable(f); err != nil { + return nil, err + } + } + return plan{preset: tabularID, question: tabularQuestion, targets: draftsOf(files)}.source() +} diff --git a/internal/preset/textencoding.go b/internal/preset/textencoding.go new file mode 100644 index 00000000..983f7a4b --- /dev/null +++ b/internal/preset/textencoding.go @@ -0,0 +1,413 @@ +package preset + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" + "github.com/donislawdev/TestingFilesGenerator/internal/format" + "github.com/donislawdev/TestingFilesGenerator/internal/format/textenc" + "github.com/donislawdev/TestingFilesGenerator/internal/recipe" +) + +const ( + encodingID = "text-encoding" + // sampleParam is not called size, and that is forced rather than chosen: a + // preset parameter is a flag, --size is already one, and the build refuses + // a preset that shadows it. See clashingParameter in internal/cli. + sampleParam = "sample" + defaultSample = "4kb" + + encodingGroup = "encoding" + lineEndingGroup = "line-endings" + + // lineEndingSetting is the second axis. Written here rather than imported, + // because no package owns the name the way textenc owns the first one - csv + // declares a constant for it and log writes the string. What keeps this + // honest is not the spelling but the guard: the set is built from whatever + // the registry says carries this setting, so a format that gains it joins + // the set and a renamed setting empties the group and reddens. + lineEndingSetting = "line_ending" + + // encodingQuestion is announced by the preset AND written into the header + // of an ejected recipe. Named once rather than typed twice. + encodingQuestion = "Does my reader know which encoding a file is in, or is it guessing?" +) + +func init() { + Register(Preset{ + ID: encodingID, + Title: "Text encoding", + Question: encodingQuestion, + + Parameters: []format.Property{ + { + Name: sampleParam, Kind: format.PropertySize, + Default: defaultSample, + Detail: "How big each file of the set is. UTF-16 stores two bytes for every " + + "character, so an odd number is refused.", + }, + }, + + Requires: []string{"MVP"}, + Catches: []string{ + "a reader that assumes UTF-8 and shows a UTF-16 file as one character in three, or as rows of boxes", + "a byte order mark read as content, so the first field of an import starts with three stray characters", + "an importer that guesses the encoding from the opening bytes and guesses differently for a longer file", + "a CRLF file split into rows with an empty row after each one, or a carriage return kept inside the last field", + }, + + Says: saidAboutTheEncodingSet, + Expand: expandTextEncoding, + }) +} + +// textFile is one file of the set: a format, the settings that make it what it +// is, and what a reasonably built reader should do with it. +type textFile struct { + desc format.Descriptor + group string + props map[string]string + // label is what the file is named after - the setting that distinguishes it + // from its neighbours, such as "utf-16le_bom" or "crlf". + label string + expected, reason string +} + +func (f textFile) id() string { + return strings.ReplaceAll(f.group, "-", "_") + "_" + f.desc.ID + "_" + f.label +} + +func (f textFile) name() string { return f.label + f.desc.Extension } + +func (f textFile) draft(size int64) recipe.TargetDraft { + return recipe.TargetDraft{ + ID: f.id(), Format: f.desc.ID, Count: "1", + Size: strconv.FormatInt(size, 10), Name: f.name(), Group: f.group, + Expected: f.expected, ExpectedReason: f.reason, + Properties: f.props, + } +} + +// carrying is every format in this build that declares all of these settings. +// +// Asked of the registry rather than written down, which is the whole shape of +// this preset. The card for it, written on 2026-09-08, said the set was +// "utf-8 / utf-16 times a byte order mark times CRLF and LF on txt, md, csv and +// log" - and that set does not exist: txt has no line ending, csv has no +// encoding, and the two axes have no format in common. A list copied by hand +// goes stale green, so this one is not copied. +func carrying(settings ...string) []format.Descriptor { + var out []format.Descriptor + for _, id := range format.IDs() { + desc, err := format.Get(id) + if err == nil && declaresAll(desc, settings) { + out = append(out, desc) + } + } + return out +} + +// declaresAll says whether one format has every one of these settings. +func declaresAll(desc format.Descriptor, settings []string) bool { + for _, want := range settings { + if _, ok := declared(desc, want); !ok { + return false + } + } + return true +} + +// declared is one setting of a format as the format declares it. +func declared(desc format.Descriptor, name string) (format.Property, bool) { + for _, p := range desc.Properties { + if p.Name == name { + return p, true + } + } + return format.Property{}, false +} + +// encodingCells is the encoding half of the set, with the combinations this +// build refuses left out and named. +// +// The product is not full and cannot be generated blind. XML in UTF-16 has to +// open with a byte order mark - the specification says so and the format +// refuses the combination - so two cells of eighteen do not exist. Generating +// them would refuse the whole set over a cell nobody asked for and nobody could +// remove, because we laid it out rather than them. +// +// Which cells those are is asked of the format rather than written here. The +// rule belongs to XML today and the next text format may have its own. +func encodingCells() (files []textFile, left []string) { + for _, desc := range carrying(textenc.Setting) { + kept, dropped := cellsOfFormat(desc) + files = append(files, kept...) + left = append(left, dropped...) + } + return files, left +} + +// cellsOfFormat is the encoding half for one format. +func cellsOfFormat(desc format.Descriptor) (files []textFile, left []string) { + enc, _ := declared(desc, textenc.Setting) + for _, name := range enc.Choices { + kept, dropped := cellsOfEncoding(desc, name) + files = append(files, kept...) + left = append(left, dropped...) + } + return files, left +} + +// cellsOfEncoding is one format in one encoding, with and without a mark. +func cellsOfEncoding(desc format.Descriptor, encoding string) (files []textFile, left []string) { + for _, mark := range marks(desc) { + props := map[string]string{textenc.Setting: encoding} + label := encoding + if mark != "" { + props[textenc.SettingBOM] = mark + } + if mark == "true" { + label += "_bom" + } + if why := refusedOutright(desc, props); why != "" { + left = append(left, fmt.Sprintf("%s as %s (%s)", desc.ID, label, why)) + continue + } + files = append(files, textFile{ + desc: desc, group: encodingGroup, props: props, label: label, + expected: outcomeFor(encoding), reason: reasonFor(encoding), + }) + } + return files, left +} + +// marks is the byte order mark axis for one format, or one empty entry for a +// format that has an encoding and no mark to go with it. +// +// Both spellings rather than the declared choices, because a bool declares no +// closed set and a window draws it as a switch with two positions. +func marks(desc format.Descriptor) []string { + if _, ok := declared(desc, textenc.SettingBOM); !ok { + return []string{""} + } + return []string{"false", "true"} +} + +// outcomeFor and reasonFor are the owner's decision of 2026-09-22, and the +// line they draw is between what every reader has to handle and what is +// somebody's declared policy. +// +// UTF-8 is the one encoding a modern reader cannot decline, with or without a +// mark: the mark is legal there, and a reader showing it as stray characters +// has a defect we can name. Whether a system handles UTF-16 at all is its own +// policy - "text uploads, UTF-8 only" is a correct system, not a broken one - +// and MF5 says we do not invent that answer. +func outcomeFor(encoding string) string { + if encoding == textenc.UTF8 { + return "accept" + } + return "unspecified" +} + +func reasonFor(encoding string) string { + if encoding == textenc.UTF8 { + return "" + } + return "encoding_invalid" +} + +// lineEndingCells is the other half, and it is a separate half rather than a +// second axis of the first. +// +// No format in this build carries both settings, measured 2026-09-22 against +// the registry: an encoding belongs to md, txt and xml, a line ending to csv +// and log. The set says so out loud, because "where is the UTF-16 CSV" is the +// first question somebody reading it asks. +func lineEndingCells() []textFile { + var out []textFile + for _, desc := range carrying(lineEndingSetting) { + ending, _ := declared(desc, lineEndingSetting) + for _, name := range ending.Choices { + out = append(out, textFile{ + desc: desc, + group: lineEndingGroup, + props: map[string]string{lineEndingSetting: name}, + label: name, + // Both endings are legal in both formats and a reader that + // handles one has no excuse for the other, so this half of the + // set is stated rather than left open. + expected: "accept", + }) + } + } + return out +} + +// refusedOutright is why this format will not take these settings at any size, +// or empty when it will. +// +// The format answers rather than this file. Asked at the size the format itself +// names as its smallest for these settings, so a refusal that comes back is +// about the settings and not about the room they need. +func refusedOutright(desc format.Descriptor, props map[string]string) string { + r := format.Request{Label: true, Properties: props} + r.Bytes = desc.SmallestAccepted(r) + _, err := desc.Generator.Plan(r) + var bad *format.PropertyValueError + if errors.As(err, &bad) { + return bad.Reason + } + return "" +} + +// evenEnough refuses a size no file of this set could have. +// +// A whole file in UTF-16 has an even number of bytes, so an odd sample is not a +// file too small - it is a value that cannot be written, and the difference +// matters to the person reading the refusal. Left to the run it would arrive as +// a complaint about one file of twenty, with a floor a byte above what was +// asked for and advice to raise it. +// +// The codec answers, and it is asked without a mark so that the only thing left +// that can refuse is the width. The numbers in the message are its own. +func evenEnough(size int64) error { + for _, name := range encodingsInTheSet() { + codec, err := textenc.Parse(encodingID, map[string]string{textenc.Setting: name}) + if err != nil { + continue + } + var below *format.BelowMinimumError + if errors.As(codec.Check(encodingID, size), &below) { + return &ImpossibleError{ + Preset: encodingID, + Setting: sampleParam, + Detail: fmt.Sprintf("the set holds files in %s, and %s", name, below.Reason), + Hint: fmt.Sprintf("Set the {setting} to %d B or %d B.", + size-1, below.Minimum), + } + } + } + return nil +} + +// encodingsInTheSet is every encoding any format of this set is written in, +// once each and in the order the formats declare them. +func encodingsInTheSet() []string { + var out []string + seen := map[string]bool{} + for _, desc := range carrying(textenc.Setting) { + enc, _ := declared(desc, textenc.Setting) + out = appendUnseen(out, seen, enc.Choices) + } + return out +} + +func appendUnseen(out []string, seen map[string]bool, more []string) []string { + for _, name := range more { + if !seen[name] { + seen[name] = true + out = append(out, name) + } + } + return out +} + +// roomEnough refuses the whole set when any one file of it is out of reach. +// +// The same rule as the boundary set, and the same reason: a set missing four of +// its twenty files still looks like a set, and the four that are missing are +// whichever ones the reader was weakest at. The floor named is the highest of +// them, because raising the sample to the first one would only produce the next +// refusal. +func roomEnough(files []textFile, size int64) error { + var floor int64 + var tallest textFile + for _, f := range files { + r := format.Request{Label: true, Properties: f.props} + r.Bytes = size + if _, err := f.desc.Generator.Plan(r); err == nil { + continue + } + if need := f.desc.SmallestAccepted(r); need > floor { + floor, tallest = need, f + } + } + if floor == 0 { + return nil + } + return &ImpossibleError{ + Preset: encodingID, + Setting: sampleParam, + Detail: fmt.Sprintf("%s written as %s cannot be smaller than %d B, and every file of this set is the same size", + strings.ToUpper(tallest.desc.ID), tallest.label, floor), + Hint: fmt.Sprintf("Set the {setting} to %d B or more.", floor), + } +} + +// saidAboutTheEncodingSet names what the set does not hold. +// +// Two silences, and untouchable rule 6 is about both. The combinations this +// build refuses are left out, so a set of sixteen arrives where eighteen were +// described. And the two halves look like one grid and are not - somebody +// reading the file list will look for the UTF-16 CSV that no format in this +// build can produce. +func saidAboutTheEncodingSet(Args) []string { + var out []string + cells, left := encodingCells() + if len(left) > 0 { + out = append(out, fmt.Sprintf( + "this build refuses %s of the encoding set, so it holds %s rather than %d. Left out: %s.", + core.Count(len(left), "combination", "combinations"), + core.Count(len(cells), "file", "files"), + len(cells)+len(left), strings.Join(left, ", "))) + } + if both := carrying(textenc.Setting, lineEndingSetting); len(both) == 0 { + out = append(out, fmt.Sprintf( + "no format in this build carries an encoding and a line ending at once, so the two halves of this set are separate files rather than one grid. Encodings: %s. Line endings: %s.", + strings.Join(idsOf(carrying(textenc.Setting)), ", "), + strings.Join(idsOf(carrying(lineEndingSetting)), ", "))) + } + return out +} + +func idsOf(descs []format.Descriptor) []string { + out := make([]string, 0, len(descs)) + for _, d := range descs { + out = append(out, d.ID) + } + return out +} + +func expandTextEncoding(args Args) ([]byte, error) { + size, err := core.ParseSize(args[sampleParam]) + if err != nil { + return nil, fmt.Errorf("%s: %w", sampleParam, err) + } + // Before the files are laid out, because this refusal is about the value + // somebody typed and the one below it is about the set that value asks for. + if err := evenEnough(size); err != nil { + return nil, err + } + + cells, _ := encodingCells() + files := append(cells, lineEndingCells()...) + if len(files) == 0 { + return nil, &ImpossibleError{ + Preset: encodingID, + Detail: "no format in this build carries an encoding or a line ending, so there is no set to build", + Hint: "Run \"tfg formats\" to see what this build has.", + } + } + if err := roomEnough(files, size); err != nil { + return nil, err + } + + targets := make([]recipe.TargetDraft, 0, len(files)) + for _, f := range files { + targets = append(targets, f.draft(size)) + } + return plan{preset: encodingID, question: encodingQuestion, targets: targets}.source() +} diff --git a/internal/preset/uploadset.go b/internal/preset/uploadset.go new file mode 100644 index 00000000..e9d09591 --- /dev/null +++ b/internal/preset/uploadset.go @@ -0,0 +1,511 @@ +package preset + +import ( + "errors" + "fmt" + "sort" + "strconv" + "strings" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" + "github.com/donislawdev/TestingFilesGenerator/internal/format" +) + +// The set upload-validation lays out, and the values it is settled on. +// +// Apart from the file beside it, which is what the preset ANNOUNCES - its +// question, its parameters and the sentences it says out loud about what the +// set came out as. This is how the eight groups of files are built and which of +// them a parameter can empty. The two were one file of 498 lines of code on +// 2026-09-22 and the ceiling is 408, so the split follows what the parts do +// rather than where the count happened to fall. + +// allowList and denyList are the two lists this preset takes. They are not the +// same kind of value, which is the decision of 2026-09-22 written down. +// +// An allowed type has to become a real file of that type, so its values are +// formats the registry has. A denied one is about the EXTENSION: the measured +// set turns away .exe and .sh, and this build has no format called either - +// installer.exe would be a ZIP in any real system and deploy.sh is text. So a +// denied entry is a format id where the registry knows one and a bare extension +// otherwise, and the file it produces says out loud what is inside it. +var allowList = commaList{ + preset: uploadID, + param: allowParam, + empty: "no types were allowed, so the set has no positive control and no file to name wrongly", + check: knownFormat, + keep: lower, + duplicate: repeatedAllowed, +} + +var denyList = commaList{ + preset: uploadID, + param: denyParam, + empty: "no extensions were denied, so there is nothing for the form to turn away", + check: checkExtension, + keep: lower, + duplicate: repeatedDenied, +} + +func repeatedAllowed(first string) string { + return fmt.Sprintf( + "it is the same type as %q and the set would hold that file twice. Every allowed type appears once, because each one stands for one path through your form", + first) +} + +func repeatedDenied(first string) string { + return fmt.Sprintf( + "it is the same extension as %q and the set would hold that file twice. Every denied extension appears once, because each one stands for one rule your form has", + first) +} + +// checkExtension answers why a piece of the deny list is not an extension. +// +// An extension rather than a format, because this list is about the name. The +// value reaches a file name, so it is made of what a name is made of and +// nothing else - the same defence the boundary set's distances get, and for the +// same reason rather than by analogy. +func checkExtension(item string) string { + if strings.HasPrefix(item, ".") { + return fmt.Sprintf("an extension is written without its dot, so %q rather than %q", + strings.TrimPrefix(item, "."), item) + } + if len(item) > longestExtension { + return fmt.Sprintf("it is %d characters long and an extension here is at most %d", + len(item), longestExtension) + } + if bad := firstNotAlphanumeric(item); bad != "" { + return fmt.Sprintf( + "it holds %s, and an extension is written with letters and digits - such as exe, sh or svg. Its text becomes the end of a file name", bad) + } + return "" +} + +// firstNotAlphanumeric names the first character that cannot appear in an +// extension, quoted so a space or a control character is visible in the message. +func firstNotAlphanumeric(item string) string { + for _, r := range item { + switch { + case r >= '0' && r <= '9', r >= 'a' && r <= 'z', r >= 'A' && r <= 'Z': + default: + return fmt.Sprintf("%q", r) + } + } + return "" +} + +// deniedEntry is one extension the form is meant to turn away, and what this +// build can put inside a file of that name. +type deniedEntry struct { + ext string + // desc writes the bytes. It is the format of that name where the registry + // has one, and the filler otherwise. + desc format.Descriptor + // known says the file really is what its name claims. Where it is false the + // run says so out loud, because a test of a content sniffer would otherwise + // pass against a file that never held what it claimed to. + known bool +} + +// uploadSet is one survey settled on its parameters. +type uploadSet struct { + limit int64 + limitText string + allowed []format.Descriptor + denied []deniedEntry + // farOver is how many times the limit the one big file is, or nought when + // that file was turned off. + farOver int64 + bulk int + filler format.Descriptor +} + +func settleUpload(args Args) (uploadSet, error) { + var s uploadSet + limit, err := core.ParseSize(args[uploadLimitParam]) + if err != nil { + return s, fmt.Errorf("%s: %w", uploadLimitParam, err) + } + // The limit leads the names of the files built around it, so its text + // reaches a file name and gets the check a distance gets. + s.limitText = strings.TrimSpace(args[uploadLimitParam]) + if bad := firstUnusable(s.limitText); bad != "" { + return s, fmt.Errorf( + "%s: it holds %s, and a limit is written with digits, letters and a dot - "+ + "such as 10mb, 512 or 1.5gb. Its text becomes part of every file name", + uploadLimitParam, bad) + } + s.limit = limit + + if s.allowed, err = allowedFormats(args[allowParam]); err != nil { + return s, err + } + if s.denied, err = deniedExtensions(args[denyParam]); err != nil { + return s, err + } + if s.farOver, err = farOverTimes(args[farOverParam]); err != nil { + return s, err + } + if s.bulk, err = strconv.Atoi(args[bulkParam]); err != nil { + return s, fmt.Errorf("%s: %q is not a whole number of files", bulkParam, args[bulkParam]) + } + s.filler, err = format.Get(fillerFormat) + return s, err +} + +// allowedFormats is the allow list in registry order. +// +// Registry order rather than the order somebody typed, for the reason the +// minimal set found the hard way on 2026-09-22: walking the typing makes +// "--allow jpg,png" and "--allow png,jpg" two different recipes, two different +// recipe hashes and two file lists nobody can compare. +func allowedFormats(raw string) ([]format.Descriptor, error) { + ids, err := allowList.parse(raw) + if err != nil { + return nil, err + } + wanted := map[string]bool{} + for _, id := range ids { + wanted[id] = true + } + var out []format.Descriptor + for _, id := range format.IDs() { + if desc, err := format.Get(id); err == nil && wanted[id] { + out = append(out, desc) + } + } + return out, nil +} + +// deniedExtensions is the deny list in alphabetical order. +// +// Alphabetical rather than the registry's, because half these entries are not +// in the registry and an order that covers only half of a list is not an order. +func deniedExtensions(raw string) ([]deniedEntry, error) { + items, err := denyList.parse(raw) + if err != nil { + return nil, err + } + sort.Strings(items) + filler, err := format.Get(fillerFormat) + if err != nil { + return nil, err + } + out := make([]deniedEntry, 0, len(items)) + for _, item := range items { + entry := deniedEntry{ext: item, desc: filler} + if desc, err := format.Get(item); err == nil { + entry.desc, entry.known = desc, true + } + out = append(out, entry) + } + return out, nil +} + +// farOverTimes reads the multiplier, or nought for the file turned off. +func farOverTimes(raw string) (int64, error) { + if raw == farOverOff { + return 0, nil + } + times, err := strconv.ParseInt(strings.TrimSuffix(raw, "x"), 10, 64) + if err != nil || times < 2 { + return 0, &format.PropertyValueError{ + Format: uploadID, Key: farOverParam, Value: raw, + Reason: "it has to be a number of times the limit, written with an x - 2x or 10x - or off", + } + } + return times, nil +} + +func expandUploadValidation(args Args) ([]byte, error) { + s, err := settleUpload(args) + if err != nil { + return nil, err + } + + // The three files around the limit come from the same code the boundary set + // uses, so "under the limit is accepted, over it is refused for size_limit" + // exists once rather than in two presets that could drift. + around := limitSet{ + preset: uploadID, setting: uploadLimitParam, group: sizeGroup, + desc: s.allowed[0], limit: s.limit, limitText: s.limitText, + spread: []offset{{text: "1b", bytes: 1}}, + } + steps := around.steps() + if err := around.reachable(steps); err != nil { + return nil, err + } + + files := s.files() + if err := s.reachable(files); err != nil { + return nil, err + } + targets := append(around.drafts(steps), draftsOf(files)...) + return plan{preset: uploadID, question: uploadQuestion, targets: targets}.source() +} + +// files is every file of the set except the three around the limit. +func (s uploadSet) files() []setFile { + var out []setFile + out = append(out, s.farOverFiles()...) + out = append(out, s.degenerateFiles()...) + out = append(out, s.allowedFiles()...) + out = append(out, s.deniedFiles()...) + out = append(out, s.mismatchFiles()...) + out = append(out, s.anomalyFiles()...) + out = append(out, s.nameFiles()...) + out = append(out, s.bulkFiles()...) + return out +} + +// reachable refuses the whole set when any one file of it is out of reach. +// +// Only the files measured from the limit can be, because everything else is +// asked for at the sample size or at the format's own floor, whichever is +// larger. So the refusal always has the same way out and can name the limit +// that would work: the floor, scaled back up by the share of the limit this +// file is. +func (s uploadSet) reachable(files []setFile) error { + var worst shortfall + for _, f := range files { + short, err := s.shortfallOf(f) + if err != nil { + return err + } + // The deepest shortfall rather than the first, so the limit the + // refusal names fixes every file at once. Naming the first would send + // somebody back for the next refusal, and RC7 says a file fixed one + // error per run is the cheapest way to make them stop using the tool. + if short.need > worst.need { + worst = short + } + } + if worst.need == 0 { + return nil + } + return s.cannotReach(worst) +} + +// shortfall is one file that is smaller than its format will write, and the +// limit at which it would stop being. +type shortfall struct { + file setFile + floor int64 + need int64 +} + +// shortfallOf measures one file. The error beside it is a refusal raising the +// limit would not fix, which goes straight back rather than being weighed. +func (s uploadSet) shortfallOf(f setFile) (shortfall, error) { + err := f.refused() + if err == nil { + return shortfall{}, nil + } + var below *format.BelowMinimumError + if !errors.As(err, &below) { + return shortfall{}, &ImpossibleError{ + Preset: uploadID, Setting: uploadLimitParam, + Detail: strings.TrimPrefix(err.Error(), f.desc.ID+": "), + } + } + return shortfall{ + file: f, floor: below.Minimum, + need: wouldReach(below.Minimum, f.bytes(), s.limit), + }, nil +} + +func (s uploadSet) cannotReach(short shortfall) error { + return &ImpossibleError{ + Preset: uploadID, Setting: uploadLimitParam, + // The same sentence the boundary set writes for the same situation. + // Splicing the format's own reason in instead read as a contradiction: + // it ends "already needs that much", and after "would be 1024 B" the + // words pointed at the wrong number. + Detail: fmt.Sprintf("%s would be %d B and the smallest %s this build makes is %d B", + short.file.id, short.file.bytes(), strings.ToUpper(short.file.desc.ID), short.floor), + Hint: fmt.Sprintf( + "Raise the {setting} to %d B or more, or take %s out of the allowed types. The {setting} asked for was %d B.", + short.need, short.file.desc.ID, s.limit), + } +} + +// wouldReach is the limit at which a file this far below its floor would reach +// it, given that the file is a fixed share of the limit. Rounded up, because a +// limit that lands a byte short is advice that fails when it is followed. +func wouldReach(floor, size, limit int64) int64 { + if size <= 0 { + return limit + } + return (floor*limit + size - 1) / size +} + +// sampleFor is how big a file that is about its name or its insides should be: +// the sample, or the format's own floor where that is larger. +// +// The larger of the two rather than the sample, so that a format with a floor +// above it cannot turn a file about a NAME into a refusal about a size. +func sampleFor(desc format.Descriptor) int64 { + if floor := desc.SmallestAccepted(format.Request{Label: true}); floor > uploadSample { + return floor + } + return uploadSample +} + +// farOverFiles is the one file well past the limit, or none when it was turned +// off. +func (s uploadSet) farOverFiles() []setFile { + if s.farOver == 0 { + return nil + } + times := strconv.FormatInt(s.farOver, 10) + "x" + desc := s.allowed[0] + return []setFile{{ + id: "far_over_" + times, group: sizeGroup, desc: desc, + name: s.limitText + "_far_over_" + times + desc.Extension, + size: s.limit * s.farOver, + expected: "reject", reason: "size_limit", + }} +} + +// degenerateFiles is the upload of nothing at all. +// +// Written by the filler rather than by an allowed format, because a file of +// nought bytes is bytes of no kind and most formats have no such thing. The +// name still carries an allowed extension, which is what makes it the case a +// form really meets: somebody pressed upload on an empty file. +func (s uploadSet) degenerateFiles() []setFile { + return []setFile{{ + id: "empty", group: degenerateGroup, desc: s.filler, + name: "empty" + s.allowed[0].Extension, size: 0, + // Legal, and what a form should do with it is its own decision - + // storage keeps it, an upload form usually turns it away, and both are + // defensible. MF5. + expected: "unspecified", reason: "size_zero", + }} +} + +// allowedFiles is one real file of every allowed type, comfortably inside the +// limit. If these fail, every refusal the rest of the set reports means nothing. +func (s uploadSet) allowedFiles() []setFile { + out := make([]setFile, 0, len(s.allowed)) + for _, desc := range s.allowed { + out = append(out, setFile{ + id: "allowed_" + desc.ID, group: allowedGroup, desc: desc, + name: "allowed_" + desc.ID + desc.Extension, + size: s.limit / halfShare, expected: "accept", + }) + } + return out +} + +// deniedFiles is one file per denied extension. +func (s uploadSet) deniedFiles() []setFile { + out := make([]setFile, 0, len(s.denied)) + for _, entry := range s.denied { + out = append(out, setFile{ + id: "denied_" + entry.ext, group: deniedGroup, desc: entry.desc, + name: "denied." + entry.ext, size: sampleFor(entry.desc), + expected: "reject", reason: "extension_rule", + }) + } + return out +} + +// mismatchFiles is every allowed type under the name of the next one. +// +// Built from the allow list rather than from three names written here, so the +// group is about the types the reader said it takes. Each file is something the +// form accepts, wearing the extension of something else it accepts - which is +// the shape that gets past a check made on the name. +// +// It needs two allowed types and there is nothing to say when there is one. +func (s uploadSet) mismatchFiles() []setFile { + if len(s.allowed) < 2 { + return nil + } + out := make([]setFile, 0, len(s.allowed)) + for i, named := range s.allowed { + inside := s.allowed[(i+1)%len(s.allowed)] + out = append(out, setFile{ + id: "mismatch_" + named.ID, group: mismatchGroup, desc: inside, + name: inside.ID + "_as_" + named.ID + named.Extension, + size: sampleFor(inside), expected: "reject", reason: "mime_mismatch", + }) + } + return out +} + +// anomalyFiles is three names that are not quite an extension. +func (s uploadSet) anomalyFiles() []setFile { + desc := s.allowed[0] + size := sampleFor(desc) + out := []setFile{ + { + id: "no_extension", group: anomalyGroup, desc: desc, + name: "invoice", size: size, + // Whether a form insists on an extension is its own rule, and both + // answers are defensible. + expected: "unspecified", reason: "extension_rule", + }, + { + id: "uppercase_extension", group: anomalyGroup, desc: desc, + name: "PHOTO" + strings.ToUpper(desc.Extension), size: size, + expected: "unspecified", reason: "extension_rule", + }, + } + // The double extension needs something denied to end with. The deny list + // cannot be empty - the parser refuses one that names nothing - so this is + // a guard against a list that arrived some other way rather than a case. + if len(s.denied) > 0 { + out = append(out, setFile{ + id: "double_extension", group: anomalyGroup, desc: desc, + name: "invoice" + desc.Extension + "." + s.denied[0].ext, size: size, + expected: "reject", reason: "extension_rule", + }) + } + return out +} + +// nameFiles is three names a form has to write to disk, or refuse for a reason +// it can say out loud. +// +// The names are what they are on purpose: a long one for a column that is 255 +// characters wide, one outside ASCII for a path handled as bytes, and one with +// spaces and brackets that is perfectly legal and still breaks a script that +// did not quote it. +func (s uploadSet) nameFiles() []setFile { + desc := s.allowed[0] + size := sampleFor(desc) + return []setFile{ + { + id: "long_name", group: nameGroup, desc: desc, + name: strings.Repeat("a", 204) + desc.Extension, size: size, + expected: "unspecified", reason: "filename_too_long", + }, + { + id: "outside_ascii", group: nameGroup, desc: desc, + name: "wiadomość_日本語_🎉" + desc.Extension, size: size, + expected: "unspecified", reason: "filename_invalid", + }, + { + id: "spaces_and_brackets", group: nameGroup, desc: desc, + name: "my report (final) v2" + desc.Extension, size: size, + // A legal name on every filesystem this runs on, so this one is a + // promise rather than a question. + expected: "accept", + }, + } +} + +// bulkFiles is the mass upload, or none when it was turned off. +func (s uploadSet) bulkFiles() []setFile { + if s.bulk == 0 { + return nil + } + desc := s.allowed[0] + return []setFile{{ + id: "bulk", group: bulkGroup, desc: desc, count: s.bulk, + name: "bulk_{index:04}" + desc.Extension, + size: s.limit / bulkShare, expected: "accept", + }} +} diff --git a/internal/preset/uploadvalidation.go b/internal/preset/uploadvalidation.go new file mode 100644 index 00000000..154025c7 --- /dev/null +++ b/internal/preset/uploadvalidation.go @@ -0,0 +1,213 @@ +package preset + +import ( + "fmt" + "strings" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" + "github.com/donislawdev/TestingFilesGenerator/internal/format" +) + +const ( + uploadID = "upload-validation" + + // limit is spelled the same as the boundary set's, and that is the point + // rather than a collision. Two presets asking for the number a system + // declares as its limit have to ask for it in the same word, or somebody + // learns one and types the other. The shared namespace is what makes + // "--preset upload-validation --limit 5mb" read as one sentence, and + // Declaring names every owner so the refusal beside a bare --limit can too. + uploadLimitParam = "limit" + allowParam = "allow" + denyParam = "deny" + farOverParam = "far-over" + bulkParam = "bulk" + + defaultUploadLimit = "10mb" + defaultAllow = "jpg,png,pdf" + defaultDeny = "svg,html,exe,sh" + // The owner's decision of 2026-09-22. Ten times the limit is the case worth + // having - a form that reads the whole body into memory before it looks at + // the size dies on it - but at the placeholder limit that one file is 100 MB + // of the 205 MB an untouched run would write. Twice the limit asks the same + // question of a form that checks after reading, and somebody who wants the + // heavier case types --far-over 10x. + defaultFarOver = "2x" + farOverOff = "off" + defaultBulk = "50" + // A mass upload of ten thousand files is already a thousand times the limit + // in bytes and far past what any form takes at once. The ceiling is here so + // that a slip of the keyboard is refused by the declaration rather than + // discovered as a full disk. + mostBulk = 10000 + + // The fractions of the limit the set is built from. Half the limit is + // comfortably inside it for the positive control, and a tenth of it is a + // file somebody would really upload fifty of at once. + halfShare = 2 + bulkShare = 10 + + // uploadSample is how big a file that is about its NAME or what is INSIDE + // it should be. Those files say nothing about size, so they are as small as + // they can be without being about smallness too. + uploadSample = 4 << 10 + + // longestExtension is what this preset will take as one. Nothing on any + // filesystem here is near it - it is a bound rather than a rule, so that a + // pasted sentence is refused as a sentence instead of becoming a file name. + longestExtension = 16 + + sizeGroup = "size-limit" + degenerateGroup = "degenerate" + allowedGroup = "allowed-types" + deniedGroup = "denied-types" + mismatchGroup = "extension-content-mismatch" + anomalyGroup = "extension-anomalies" + nameGroup = "hostile-names" + bulkGroup = "bulk-upload" + + // fillerFormat is what a file holds when the set needs bytes of no + // particular kind: an empty file, or a name whose extension the registry + // has never heard of. + fillerFormat = "txt" + + // uploadQuestion is announced by the preset AND written into the header of + // an ejected recipe. Named once rather than typed twice. + uploadQuestion = "Does my upload form take what it should and turn the rest away?" +) + +func init() { + Register(Preset{ + ID: uploadID, + Title: "Upload validation", + Question: uploadQuestion, + + Parameters: []format.Property{ + { + Name: uploadLimitParam, Kind: format.PropertySize, + Default: defaultUploadLimit, + Detail: "The size limit your upload form declares. This set takes one step either " + + "side of it - for a file at every distance, run the size-boundaries preset.", + }, + { + Name: allowParam, Kind: format.PropertyText, + Shape: "format ids separated by commas", + Default: defaultAllow, + Detail: "Which types your form is supposed to accept. Each one becomes a real file " + + "of that type, and they are the positive control of the whole set.", + }, + { + Name: denyParam, Kind: format.PropertyText, + Shape: "extensions separated by commas", + Default: defaultDeny, + Detail: "Which extensions your form is supposed to turn away. An extension this build " + + "has no format for still gets a file under that name, holding plain text.", + }, + { + Name: farOverParam, Kind: format.PropertyChoice, + Choices: []string{"10x", "2x", farOverOff}, + Default: defaultFarOver, + Detail: "How far past the limit the one big file goes. Turn it off where writing " + + "several times the limit is not worth the disk.", + }, + { + Name: bulkParam, Kind: format.PropertyInt, + Min: 0, Max: mostBulk, Unit: "files", + Default: defaultBulk, + Detail: "How many files the mass upload holds. Nought leaves that group out " + + "of the set altogether.", + }, + }, + + SaidWhenDefaulted: map[string]string{ + uploadLimitParam: "no limit was given, so this set is built around " + defaultUploadLimit + + " - that is our placeholder and not your form's limit. Pass the limit your form declares, or the files say nothing about it.", + }, + + Requires: []string{"MVP"}, + Catches: []string{ + "a limit enforced in the browser and not on the server", + "an SVG or an HTML file taken for a picture or for plain text, which is a way to get a script past a form", + "a file checked by its extension and never opened, so a PDF named .jpg goes through", + "a form that reads the whole body into memory before it looks at how big it is", + "an upload named PHOTO.JPG turned away where photo.jpg is taken, or the other way round", + "a name with spaces, brackets or characters outside ASCII written to disk unchanged", + }, + + Says: saidAboutTheUploadSet, + Expand: expandUploadValidation, + }) +} + +// saidAboutTheUploadSet names what this set is not, given what it was asked for. +// +// Three silences, and untouchable rule 6 is about all of them. A group that a +// parameter emptied looks exactly like a group that was forgotten. And a file +// whose inside is a stand-in reads as a real one: somebody testing a content +// sniffer against denied.exe would be testing it against plain text and would +// never find out from the file. +func saidAboutTheUploadSet(args Args) []string { + s, err := settleUpload(args) + if err != nil { + // Expand is about to refuse these same values with a message that names + // the one that is wrong. A sentence here would be a second opinion. + return nil + } + var out []string + if stood := standIns(s.denied); len(stood) > 0 { + out = append(out, fmt.Sprintf( + "this build has no format called %s, so %s %s plain text under %s. That tests a form reading the end of a name, not one reading what is inside.", + joinWithOr(stood), joinWithAnd(namesOf(stood)), + core.Noun(len(stood), "holds", "hold"), + core.Noun(len(stood), "that name", "those names"))) + } + if s.farOver == 0 { + out = append(out, "far-over is off, so nothing in this set is well past the limit. The largest file is one byte over it.") + } + if s.bulk == 0 { + out = append(out, "bulk is nought, so this set holds no mass upload.") + } + if len(s.allowed) < 2 { + out = append(out, "only one type is allowed, so the set holds no file named as one allowed type and filled with another - that needs two.") + } + return out +} + +// standIns is the denied extensions this build has no format for. +func standIns(denied []deniedEntry) []string { + var out []string + for _, entry := range denied { + if !entry.known { + out = append(out, entry.ext) + } + } + return out +} + +// joinWithAnd and joinWithOr write a list the way a sentence takes one. +// +// A comma between every pair is how a machine writes a list and it reads as an +// enumeration rather than as a sentence: "denied.exe, denied.sh holds plain +// text" has no number to agree with. The text rules in CLAUDE.md ask for a +// sentence, so the last pair gets its conjunction. +func joinWithAnd(items []string) string { return joinWith(items, "and") } + +func joinWithOr(items []string) string { return joinWith(items, "or") } + +func joinWith(items []string, conjunction string) string { + switch len(items) { + case 0: + return "" + case 1: + return items[0] + } + return strings.Join(items[:len(items)-1], ", ") + " " + conjunction + " " + items[len(items)-1] +} + +func namesOf(extensions []string) []string { + out := make([]string, 0, len(extensions)) + for _, ext := range extensions { + out = append(out, "denied."+ext) + } + return out +} diff --git a/web/content/en/site.json b/web/content/en/site.json index 432ca61c..af68da73 100644 --- a/web/content/en/site.json +++ b/web/content/en/site.json @@ -96,7 +96,10 @@ }, "presets": { "empty-and-minimal": "Does a file that is valid and as small as the format allows get through?", - "size-boundaries": "Is a size limit enforced exactly where it is declared?" + "size-boundaries": "Is a size limit enforced exactly where it is declared?", + "tabular-import": "Does my table import survive what real tools export?", + "text-encoding": "Does my reader know which encoding a file is in, or is it guessing?", + "upload-validation": "Does my upload form take what it should and turn the rest away?" }, "commands": { "generate": "produce files, from a recipe or from flags", diff --git a/web/content/pl/site.json b/web/content/pl/site.json index 9bd1fc00..05441ad8 100644 --- a/web/content/pl/site.json +++ b/web/content/pl/site.json @@ -96,7 +96,10 @@ }, "presets": { "empty-and-minimal": "Czy plik poprawny i najmniejszy, na jaki format pozwala, przechodzi?", - "size-boundaries": "Czy limit rozmiaru działa dokładnie tam, gdzie jest zadeklarowany?" + "size-boundaries": "Czy limit rozmiaru działa dokładnie tam, gdzie jest zadeklarowany?", + "tabular-import": "Czy import tabeli przetrwa to, co eksportują prawdziwe narzędzia?", + "text-encoding": "Czy mój czytnik wie, w jakim kodowaniu jest plik, czy zgaduje?", + "upload-validation": "Czy mój formularz uploadu przyjmuje to, co powinien, i odrzuca resztę?" }, "commands": { "generate": "tworzy pliki, z przepisu albo z flag", diff --git a/web/public/docs/index.html b/web/public/docs/index.html index 238dbe56..b5716b89 100644 --- a/web/public/docs/index.html +++ b/web/public/docs/index.html @@ -315,6 +315,18 @@

What is a preset?

size-boundaries

Is a size limit enforced exactly where it is declared?

+
  • +

    tabular-import

    +

    Does my table import survive what real tools export?

    +
  • +
  • +

    text-encoding

    +

    Does my reader know which encoding a file is in, or is it guessing?

    +
  • +
  • +

    upload-validation

    +

    Does my upload form take what it should and turn the rest away?

    +
  • tfg preset list
     tfg preset show size-boundaries
    diff --git a/web/public/pl/dokumentacja/index.html b/web/public/pl/dokumentacja/index.html
    index 5b59a2e6..a9208fb6 100644
    --- a/web/public/pl/dokumentacja/index.html
    +++ b/web/public/pl/dokumentacja/index.html
    @@ -316,6 +316,18 @@ 

    Czym jest preset?

    size-boundaries

    Czy limit rozmiaru działa dokładnie tam, gdzie jest zadeklarowany?

    +
  • +

    tabular-import

    +

    Czy import tabeli przetrwa to, co eksportują prawdziwe narzędzia?

    +
  • +
  • +

    text-encoding

    +

    Czy mój czytnik wie, w jakim kodowaniu jest plik, czy zgaduje?

    +
  • +
  • +

    upload-validation

    +

    Czy mój formularz uploadu przyjmuje to, co powinien, i odrzuca resztę?

    +
  • tfg preset list
     tfg preset show size-boundaries
    
    From 88803aea4318eecf50447d62c70dc82f556b4394 Mon Sep 17 00:00:00 2001
    From: DonislawDev 
    Date: Tue, 22 Sep 2026 18:01:34 +0200
    Subject: [PATCH 2/3] preset: the guard for a preset's recipe asks whether the
     format exists
    
    recipe.Parse does not resolve formats - the engine does - so a preset
    naming a format nobody registered produced a recipe that PARSED and a run
    that could not start. The guard read "does it parse" and said nothing.
    
    Found by mutation while re-pointing the entries whose code moved, and
    checked in a worktree on f31dd9c: it was green there too, so this is a
    hole rather than a regression. O234.
    
    Co-Authored-By: Claude Opus 5 
    ---
     internal/guard/preset_test.go | 17 +++++++++++++++++
     1 file changed, 17 insertions(+)
    
    diff --git a/internal/guard/preset_test.go b/internal/guard/preset_test.go
    index 4d501f7c..76c3b78a 100644
    --- a/internal/guard/preset_test.go
    +++ b/internal/guard/preset_test.go
    @@ -5,6 +5,7 @@ import (
     	"strings"
     	"testing"
     
    +	"github.com/donislawdev/TestingFilesGenerator/internal/format"
     	_ "github.com/donislawdev/TestingFilesGenerator/internal/format/all"
     	"github.com/donislawdev/TestingFilesGenerator/internal/preset"
     	"github.com/donislawdev/TestingFilesGenerator/internal/recipe"
    @@ -46,6 +47,22 @@ func TestEveryPresetExpandsIntoARecipeThisBuildAccepts(t *testing.T) {
     				if target.Group == "" {
     					t.Errorf("target %q carries no group, so nothing can assert about the class it belongs to", target.ID)
     				}
    +				// The parser does not resolve formats - the engine does, and
    +				// "tfg validate" answers with exit 4 and the list of known
    +				// ones. So a preset naming a format nobody registered produces
    +				// a recipe that PARSES and a run that cannot start, and this
    +				// guard read "the recipe it produced does not parse" and said
    +				// nothing about it.
    +				//
    +				// Measured on 2026-09-22 by mutation: putting an x on the end
    +				// of the format id in the boundary set left this guard green,
    +				// and it had been green against that mutation on the commit
    +				// before as well. The entry was proving nothing rather than
    +				// something breaking.
    +				if _, err := format.Get(target.Format); err != nil {
    +					t.Errorf("target %q asks for the format %q and this build has none: %v",
    +						target.ID, target.Format, err)
    +				}
     			}
     		})
     	}
    
    From 3505ae512516f148cd2b0e73e585b43081981cc4 Mon Sep 17 00:00:00 2001
    From: DonislawDev 
    Date: Tue, 22 Sep 2026 18:18:51 +0200
    Subject: [PATCH 3/3] preset: a type cannot be allowed and denied at once, and
     a denied file takes the real extension
    
    CodeRabbit on #122, checked as a hypothesis and true: --allow pdf
    --deny pdf laid out a set holding allowed_pdf.pdf expecting accept and
    denied.pdf expecting reject for extension_rule. Both reach the manifest,
    so any suite running that set contradicts itself whatever the system
    under test does - and nothing said a word. The whole set is refused
    rather than one half dropped, because dropping a half chooses for
    somebody which of the two they meant.
    
    Found while checking that one: a denied file was named from the format
    id, so targz became denied.targz. A format's extension is not always a
    dot and its id, and .targz is a name no upload form has a rule about -
    the one thing that group exists to test. It takes desc.Extension now,
    and so does the double-extension file.
    
    Two guards, two mutations, both caught.
    
    Co-Authored-By: Claude Opus 5 
    ---
     internal/guard/uploadset_test.go      | 94 +++++++++++++++++++++++++++
     internal/preset/uploadset.go          | 54 ++++++++++++++-
     web/content/pl/site.json              |  4 +-
     web/public/pl/dokumentacja/index.html |  4 +-
     4 files changed, 150 insertions(+), 6 deletions(-)
     create mode 100644 internal/guard/uploadset_test.go
    
    diff --git a/internal/guard/uploadset_test.go b/internal/guard/uploadset_test.go
    new file mode 100644
    index 00000000..5aaa511d
    --- /dev/null
    +++ b/internal/guard/uploadset_test.go
    @@ -0,0 +1,94 @@
    +package guard
    +
    +import (
    +	"strings"
    +	"testing"
    +
    +	"github.com/donislawdev/TestingFilesGenerator/internal/format"
    +	_ "github.com/donislawdev/TestingFilesGenerator/internal/format/all"
    +	"github.com/donislawdev/TestingFilesGenerator/internal/preset"
    +	"github.com/donislawdev/TestingFilesGenerator/internal/recipe"
    +)
    +
    +// A type cannot be allowed and denied at once.
    +//
    +// The two lists never saw each other, so "--allow pdf --deny pdf" laid out a
    +// set holding a PDF expecting accept and a PDF expecting reject for
    +// extension_rule. Both reach the manifest, so any suite running that set
    +// contradicts itself whatever the system under test does - and nothing said a
    +// word, which is untouchable rule 6 on the silence that is hardest to notice:
    +// the one where nothing fails.
    +//
    +// Found by review on 2026-09-22, and the whole set is refused rather than one
    +// half dropped, because dropping a half chooses for somebody which of the two
    +// they meant.
    +func TestAnExtensionCannotBeAllowedAndDeniedAtOnce(t *testing.T) {
    +	// The state this guard is about, asserted rather than assumed: the
    +	// declared defaults have to be buildable, or the refusal below would be
    +	// the preset refusing everything.
    +	if _, err := preset.Expand("upload-validation", preset.Args{}); err != nil {
    +		t.Fatalf("the preset refuses its own defaults, so nothing here is about an overlap: %v", err)
    +	}
    +
    +	for _, id := range []string{"pdf", "targz"} {
    +		_, err := preset.Expand("upload-validation", preset.Args{"allow": id, "deny": id})
    +		if err == nil {
    +			t.Errorf("%s is allowed and denied at once and the set was built anyway - one of its "+
    +				"files expects accept and another expects reject, and both are %s", id, id)
    +			continue
    +		}
    +		if !strings.Contains(err.Error(), id) {
    +			t.Errorf("the refusal for %s allowed and denied does not name it: %s", id, err)
    +		}
    +	}
    +}
    +
    +// Every file of the denied group is named with the extension the registry
    +// declares for it.
    +//
    +// A format's extension is not always a dot and its id. targz is written
    +// .tar.gz, so a denied file built from the id alone was called denied.targz -
    +// a name no upload form has a rule about, which is the one thing that group
    +// exists to test. Found on 2026-09-22 while checking the overlap above.
    +//
    +// An entry this build has no format for keeps the extension as typed, which is
    +// the point of taking those at all.
    +func TestADeniedFileIsNamedWithTheExtensionTheRegistryDeclares(t *testing.T) {
    +	const denied = "targz,zip,exe"
    +
    +	expanded, err := preset.Expand("upload-validation", preset.Args{"deny": denied})
    +	if err != nil {
    +		t.Fatalf("the preset refused %q: %v", denied, err)
    +	}
    +	doc, err := recipe.Parse(expanded.Source, "upload-validation.yaml")
    +	if err != nil {
    +		t.Fatalf("the preset wrote a recipe this build cannot read: %v", err)
    +	}
    +
    +	checked := 0
    +	for _, target := range doc.Targets {
    +		if target.Group != "denied-types" {
    +			continue
    +		}
    +		checked++
    +		want := "." + strings.TrimPrefix(target.ID, "denied_")
    +		if desc, err := format.Get(strings.TrimPrefix(target.ID, "denied_")); err == nil {
    +			want = desc.Extension
    +		}
    +		if !strings.HasSuffix(target.Name, want) {
    +			t.Errorf("the denied file %s is called %q and this build writes that format as %q",
    +				target.ID, target.Name, want)
    +		}
    +	}
    +	if checked != 3 {
    +		t.Fatalf("%d denied file(s) for a list of three, so this guard is not looking at what it thinks",
    +			checked)
    +	}
    +	// One of the three has a multi-part extension and one is outside the
    +	// registry, or the two halves of this guard are the same half twice.
    +	if desc, err := format.Get("targz"); err != nil || desc.Extension == ".targz" {
    +		t.Errorf("targz is written %q in this build, so it no longer stands for the case this "+
    +			"guard was written about - find another format whose extension is not a dot and its id",
    +			desc.Extension)
    +	}
    +}
    diff --git a/internal/preset/uploadset.go b/internal/preset/uploadset.go
    index e9d09591..4dc37e7b 100644
    --- a/internal/preset/uploadset.go
    +++ b/internal/preset/uploadset.go
    @@ -107,6 +107,19 @@ type deniedEntry struct {
     	known bool
     }
     
    +// extension is what a file of this entry is named with, dot included.
    +//
    +// A format the registry has answers for itself, because an extension is not
    +// always a dot and an id: targz is written .tar.gz, and denied.targz would be
    +// a file no upload form has a rule about - which is the one thing this group
    +// exists to test.
    +func (e deniedEntry) extension() string {
    +	if e.known {
    +		return e.desc.Extension
    +	}
    +	return "." + e.ext
    +}
    +
     // uploadSet is one survey settled on its parameters.
     type uploadSet struct {
     	limit     int64
    @@ -143,6 +156,9 @@ func settleUpload(args Args) (uploadSet, error) {
     	if s.denied, err = deniedExtensions(args[denyParam]); err != nil {
     		return s, err
     	}
    +	if err := listsAgree(s.allowed, s.denied); err != nil {
    +		return s, err
    +	}
     	if s.farOver, err = farOverTimes(args[farOverParam]); err != nil {
     		return s, err
     	}
    @@ -153,6 +169,40 @@ func settleUpload(args Args) (uploadSet, error) {
     	return s, err
     }
     
    +// listsAgree refuses an extension that is allowed and denied at once.
    +//
    +// Neither list can see the other, so "--allow pdf --deny pdf" laid a set out
    +// holding allowed_pdf.pdf expecting accept and denied.pdf expecting reject for
    +// extension_rule. Both expectations reach the manifest, so any suite running
    +// that set contradicts itself whatever the system under test does - and the run
    +// said nothing, which is untouchable rule 6 on the worst kind of silence: the
    +// one where nothing fails.
    +//
    +// The whole set is refused rather than one half dropped, because dropping a
    +// half is choosing for somebody which of the two they meant. Found by review on
    +// 2026-09-22, not by a guard, and there is one now.
    +func listsAgree(allowed []format.Descriptor, denied []deniedEntry) error {
    +	turned := make(map[string]string, len(denied))
    +	for _, entry := range denied {
    +		turned[entry.extension()] = entry.ext
    +	}
    +	for _, desc := range allowed {
    +		written, both := turned[desc.Extension]
    +		if !both {
    +			continue
    +		}
    +		return &ImpossibleError{
    +			Preset: uploadID, Setting: denyParam,
    +			Detail: fmt.Sprintf(
    +				"%s is allowed and %s is denied, and both name a file ending %s - so the set would hold one of them to be taken and one to be turned away",
    +				desc.ID, written, desc.Extension),
    +			Hint: fmt.Sprintf("Take %s out of the %s list, or %s out of the %s list.",
    +				desc.ID, allowParam, written, denyParam),
    +		}
    +	}
    +	return nil
    +}
    +
     // allowedFormats is the allow list in registry order.
     //
     // Registry order rather than the order somebody typed, for the reason the
    @@ -404,7 +454,7 @@ func (s uploadSet) deniedFiles() []setFile {
     	for _, entry := range s.denied {
     		out = append(out, setFile{
     			id: "denied_" + entry.ext, group: deniedGroup, desc: entry.desc,
    -			name: "denied." + entry.ext, size: sampleFor(entry.desc),
    +			name: "denied" + entry.extension(), size: sampleFor(entry.desc),
     			expected: "reject", reason: "extension_rule",
     		})
     	}
    @@ -459,7 +509,7 @@ func (s uploadSet) anomalyFiles() []setFile {
     	if len(s.denied) > 0 {
     		out = append(out, setFile{
     			id: "double_extension", group: anomalyGroup, desc: desc,
    -			name: "invoice" + desc.Extension + "." + s.denied[0].ext, size: size,
    +			name: "invoice" + desc.Extension + s.denied[0].extension(), size: size,
     			expected: "reject", reason: "extension_rule",
     		})
     	}
    diff --git a/web/content/pl/site.json b/web/content/pl/site.json
    index 05441ad8..bbd50cd4 100644
    --- a/web/content/pl/site.json
    +++ b/web/content/pl/site.json
    @@ -97,9 +97,9 @@
       "presets": {
         "empty-and-minimal": "Czy plik poprawny i najmniejszy, na jaki format pozwala, przechodzi?",
         "size-boundaries": "Czy limit rozmiaru działa dokładnie tam, gdzie jest zadeklarowany?",
    -    "tabular-import": "Czy import tabeli przetrwa to, co eksportują prawdziwe narzędzia?",
    +    "tabular-import": "Czy import tabeli poradzi sobie z tym, co eksportują prawdziwe narzędzia?",
         "text-encoding": "Czy mój czytnik wie, w jakim kodowaniu jest plik, czy zgaduje?",
    -    "upload-validation": "Czy mój formularz uploadu przyjmuje to, co powinien, i odrzuca resztę?"
    +    "upload-validation": "Czy mój formularz przesyłania plików przyjmuje to, co powinien, i odrzuca resztę?"
       },
       "commands": {
         "generate": "tworzy pliki, z przepisu albo z flag",
    diff --git a/web/public/pl/dokumentacja/index.html b/web/public/pl/dokumentacja/index.html
    index a9208fb6..61922942 100644
    --- a/web/public/pl/dokumentacja/index.html
    +++ b/web/public/pl/dokumentacja/index.html
    @@ -318,7 +318,7 @@ 

    Czym jest preset?

  • tabular-import

    -

    Czy import tabeli przetrwa to, co eksportują prawdziwe narzędzia?

    +

    Czy import tabeli poradzi sobie z tym, co eksportują prawdziwe narzędzia?

  • text-encoding

    @@ -326,7 +326,7 @@

    Czym jest preset?

  • upload-validation

    -

    Czy mój formularz uploadu przyjmuje to, co powinien, i odrzuca resztę?

    +

    Czy mój formularz przesyłania plików przyjmuje to, co powinien, i odrzuca resztę?

  • tfg preset list