diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3e2bb42..1bfe273d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1362,7 +1362,16 @@ jobs: set -euo pipefail sudo apt-get update sudo apt-get install -y --no-install-recommends \ - p7zip-full ffmpeg poppler-utils inkscape python3-pil python3-yaml + p7zip-full ffmpeg poppler-utils inkscape python3-pil python3-yaml gdal-bin + + # GeoJSON is read by GDAL and its shapes judged by shapely, which is + # GEOS underneath (docs/GEOJSON-2026-10-07.md). shapely goes in for + # the same interpreter the oracle reaches for, as Pillow does below. + # Both are asked for their version, so a tool that did not install + # stops this step rather than turning the GeoJSON guards into skips. + python -m pip install --break-system-packages shapely + ogrinfo --version + python -c "import shapely; print('shapely', shapely.__version__, 'GEOS', shapely.geos_version_string)" # The distribution's Pillow cannot open an AVIF - measured on this # runner, PIL.UnidentifiedImageError on a file the structural checker diff --git a/CHANGELOG.md b/CHANGELOG.md index ca07722c..f161c941 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,25 @@ because it turns other people's test suites red. with one picture throughout. The smallest film at the default settings is 3312 B. A pipeline that expects H.264 in an MP4 may refuse AV1, which is a test worth having. +- **Maps: the `geojson` format.** A GeoJSON FeatureCollection (RFC 7946) at + the exact size you ask for, read by GDAL, the reader under QGIS and + ogr2ogr. Every feature carries a geometry and a set of properties with every + JSON value type, and the ids run 1..N. By default the seven geometry types + take turns, so a file of seven features or more holds every one of them - + `geometry` picks one instead. Set `formatting` (the same three layouts as + `json`), `precision` (0 to 15 decimal places, 6 by default, about ten + centimetres), `altitude` for a third number in every position and `vertices` + for the points in every line and outline, up to a million in one outline. + Two settings make a file that is valid and still hard: `winding=reversed` + runs outlines clockwise, which RFC 7946 tells readers to accept, and + `antimeridian` makes every line and outline cross the 180th meridian + without being cut in two - read as flat coordinates, such an outline crosses + itself. Every shape is valid by construction and checked with shapely. The + smallest file at the default settings is 875 B. A feature larger than 1 MiB + ends the file with spaces after it rather than a longer note, because GDAL + refuses a text value of ten million characters. At precision 3 or less a + line has fewer points than that, one for each step of longitude the globe + has, and asking for more is refused with the number that fits. - **A length of time as a setting.** `duration`, `change_interval` and `keyframe_interval` take `10s`, `1m30s`, `1h`, `500ms` or `59.9s`, to the millisecond. A bare number is refused rather than read as seconds, and so is a length that does not @@ -160,10 +179,10 @@ because it turns other people's test suites red. ### Changed -- **`empty-and-minimal` now includes the films.** The preset builds the +- **`empty-and-minimal` now includes the films and GeoJSON.** The preset builds the smallest file of every format this build has, so with `formats` left at - `all` it gains a `webm` and an `mp4` target, and the recipe - `tfg preset eject empty-and-minimal` prints is two targets longer. A manifest from a run of that preset records the + `all` it gains a `webm`, an `mp4` and a `geojson` target, and the recipe + `tfg preset eject empty-and-minimal` prints is three targets longer. A manifest from a run of that preset records the hash of that recipe, so its `recipe_hash` differs from one written before. No generated file changes, and a run that names its `formats` is untouched. - **An empty text box in the window reads "not set"** instead of "worked out diff --git a/README.md b/README.md index a5257380..6ae3872b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ **Testing Files Generator** is a tool for QA engineers and developers who need real files to test against - an upload form, a parser, anything that takes a file and -has an opinion about it. You pick one of its 28 formats and the size you want, +has an opinion about it. You pick one of its 29 formats and the size you want, and you get **exactly that**: ask for a 10 MB PDF and you get a PDF that a reader will open, at 10 MB to the byte. Every run also leaves a manifest saying **what your system should do with each file**, which is the part other generators leave @@ -23,7 +23,7 @@ needs it finds out it exists. - **Hit an exact size, to the byte** - ask for 10485761 bytes and get exactly that, never a silently rounded file. -- **Write 28 real formats** - a generated PNG opens in an image viewer, a DOCX +- **Write 29 real formats** - a generated PNG opens in an image viewer, a DOCX opens in Word, a ZIP extracts. Not padded zeros with an extension. - **Say what should happen to each file** - the manifest carries an expected outcome, so your test reads the assertion instead of you writing it out. @@ -165,6 +165,7 @@ owns it, at the exact size you asked for: | 🖼️ **Images** | `png`, `jpg`, `bmp`, `gif`, `ico`, `svg`, `tiff`, `webp`, `avif`, `jxl` | | 📝 **Text and markup** | `txt`, `md`, `csv`, `json`, `xml`, `html`, `log` | | ⚙️ **Configuration** | `yaml`, `toml` | +| 🗺️ **Maps** | `geojson` (RFC 7946) | | 🗜️ **Archives** | `zip`, `targz` (`.tar.gz`) | | 🔊 **Audio** | `wav` | | 🎞️ **Video** | `webm`, `mp4` (both AV1, no sound) | @@ -616,6 +617,7 @@ recipe. `tfg formats ` prints the allowed range or list for each: | `log` | `entry_format`, `timestamps`, `rate`, `methods`, `status_mix`, `level_mix`, `ip_version`, `line_ending` | | `txt`, `md`, `xml` | `encoding`, `bom` | | `json` | `formatting` | +| `geojson` | `geometry`, `formatting`, `precision`, `altitude`, `vertices`, `winding`, `antimeridian` | | `svg` | `width`, `height` | | `html` | `structure` | | `yaml`, `toml` | none in this build - the document is a fixed shape, and a size is the only thing to ask for | @@ -824,12 +826,18 @@ rounding are the two things this tool will not do. ### Can I generate a file that is deliberately broken? -Not yet. Damaged and malformed files are a planned feature - today every file is -a valid one of its format. +Yes. Add `--damage zero-head` and the file comes out at exactly the size you +asked for with its first bytes overwritten by zeros, so a reader turns it away, +and the manifest says your system should reject it. [`tfg damage`](#tfg-damage) +lists what this build can do and what each damage takes. + +``` +tfg generate --format png --size 2mb --damage zero-head --out ./out +``` ### Which formats are coming next? -`7z`, `mp3` and `mp4`. +`7z` and `mp3`. ## 🚧 Where this is diff --git a/internal/format/all/all.go b/internal/format/all/all.go index c96d82b4..cfbbb057 100644 --- a/internal/format/all/all.go +++ b/internal/format/all/all.go @@ -12,6 +12,7 @@ import ( _ "github.com/donislawdev/TestingFilesGenerator/internal/format/bmp" _ "github.com/donislawdev/TestingFilesGenerator/internal/format/csvfile" _ "github.com/donislawdev/TestingFilesGenerator/internal/format/docx" + _ "github.com/donislawdev/TestingFilesGenerator/internal/format/geojson" _ "github.com/donislawdev/TestingFilesGenerator/internal/format/gif" _ "github.com/donislawdev/TestingFilesGenerator/internal/format/htmlfile" _ "github.com/donislawdev/TestingFilesGenerator/internal/format/ico" diff --git a/internal/format/geojson/feature.go b/internal/format/geojson/feature.go new file mode 100644 index 00000000..686f21d8 --- /dev/null +++ b/internal/format/geojson/feature.go @@ -0,0 +1,258 @@ +package geojson + +import ( + "math" + // D11 promises the same bytes from the same seed, so a deliberate, + // reproducible generator is the product rather than a weakness. Nothing + // here ever makes a secret. + // nosemgrep: go.lang.security.audit.crypto.math_random.math-random-used + "math/rand/v2" + "strconv" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" +) + +const ( + // noteCap is the longest the closing note gets. Measured 2026-10-07: GDAL + // reads a string of 9 999 999 characters and refuses one of 10 000 000 + // ("Too many characters in string"), and a feature of a million points is + // 16 to 25 MB - so the remainder a closing note would have to absorb can be + // larger than the reference reader takes. Above the cap the last bytes are + // spaces after the feature, which GDAL read at 20 MB without a word. + // docs/GEOJSON-2026-10-07.md section 5, the owner's decision. + noteCap = 1 << 20 +) + +// records builds the features of the collection, one at a time, for +// core.FillRecords. +type records struct { + s settings + g grid + next int64 + e emitter + d drawing + tail []byte + shortest int64 +} + +// values is everything about a feature except its geometry and its note, +// drawn or chosen in one place so the smallest feature is measured with the +// same code that writes every other one. +type values struct { + name, tagA, tagB, city string + whole, cents, zip int64 + active bool +} + +func newRecords(s settings) *records { + r := &records{s: s, g: gridFor(s.precision), e: emitter{indent: s.layout.indent}} + r.shortest = r.measureShortest() + return r +} + +// Shortest is the smallest feature this builder can close the collection with. +func (r *records) Shortest() int64 { return r.shortest } + +// Discard hands back the number the thrown away feature took with it, so the +// closing one carries it instead and the ids read 1..N. The kind follows the +// number, so the closing feature is the kind the thrown away one would have +// been. +func (r *records) Discard() { r.next-- } + +func (r *records) Append(dst []byte, rng *rand.Rand) []byte { + dst = r.draw(dst, rng) + dst = appendPhrase(dst, rng, 3+rng.IntN(5)) + dst = r.shut(dst) + return append(dst, r.s.layout.between...) +} + +// AppendExact writes the closing feature at exactly n bytes, the end of the +// collection included. The note takes the remainder up to noteCap, and spaces +// after the feature take the rest. +func (r *records) AppendExact(dst []byte, rng *rand.Rand, n int64) []byte { + mark := len(dst) + dst = r.draw(dst, rng) + at := len(dst) + dst = r.shut(dst) + r.tail = append(r.tail[:0], dst[at:]...) + fill := n - int64(len(dst)-mark) - int64(len(r.s.layout.epilogue)) + note := min(fill, noteCap) + dst = core.AppendFiller(dst[:at], words, note, nil) + dst = append(dst, r.tail...) + dst = appendSpaces(dst, fill-note) + return append(dst, r.s.layout.epilogue...) +} + +// draw writes the next feature up to the opening quote of its note. +func (r *records) draw(dst []byte, rng *rand.Rand) []byte { + r.next++ + k := r.s.kinds[(r.next-1)%int64(len(r.s.kinds))] + r.d.draw(rng, r.s, r.g, k) + v := values{ + name: word(rng), whole: 100000 + rng.Int64N(899999), cents: rng.Int64N(100), + active: rng.IntN(2) == 0, tagA: word(rng), tagB: word(rng), city: word(rng), + zip: 10000 + rng.Int64N(90000), + } + return r.write(dst, r.next, k, v) +} + +// measureShortest is the closing feature at its longest with an empty note: +// the widest feature number, the longest word everywhere a word goes, the +// widest coordinates and the largest kind the settings draw. It has to hold +// for every draw rather than for the lucky one. +// +// Measured on the bytes rather than worked out, like everything in this +// project that has to agree with bytes beside it - but measured at three and +// four points and carried forward, because every position of a kind is the +// same number of bytes at its widest, so a kind's length grows by the same +// amount with every point, and a million points measured for every file +// planned would be the slowest part of planning it. The guard compares the two. +// +// Carried forward kind by kind and only then compared. The largest kind at +// three points need not be the largest at a million - a position nested deeper +// costs more indentation - and the largest of seven straight lines is not a +// straight line. +func (r *records) measureShortest() int64 { + var longest int64 + for _, k := range r.s.kinds { + three, four := r.worstLength(k, minVertices), r.worstLength(k, minVertices+1) + longest = max(longest, three+int64(r.s.vertices-minVertices)*(four-three)) + } + return longest +} + +// ClosingFeatureBounds is the smallest closing feature worked out two ways, for +// the guard that keeps planning honest: carried forward from three and four +// points the way Plan does it, and measured whole at the points asked for. +func ClosingFeatureBounds(props map[string]string) (carried, whole int64, err error) { + s, err := parse(props) + if err != nil { + return 0, 0, err + } + r := newRecords(s) + for _, k := range s.kinds { + whole = max(whole, r.worstLength(k, s.vertices)) + } + return r.Shortest(), whole, nil +} + +// worstLength is the length of the longest closing feature of kind k with n +// points, the end of the collection included. +func (r *records) worstLength(k kind, n int) int64 { + s := r.s + s.vertices = n + r.d.worst(s, r.g, k) + widest := values{name: longestWord, tagA: longestWord, tagB: longestWord, city: longestWord, + whole: 999999, cents: 99, zip: 99999} + buf := r.shut(r.write(nil, math.MaxInt64, k, widest)) + return int64(len(buf) + len(s.layout.epilogue)) +} + +// write is one feature through the opening quote of its note, from a drawing +// already made and values already chosen. +func (r *records) write(dst []byte, id int64, k kind, v values) []byte { + e := &r.e + e.b = append(dst, r.s.layout.start...) + e.depth = featureDepth + e.open('{') + e.key("type") + e.text("Feature") + e.key("id") + e.whole(id) + e.key("geometry") + r.geometry(k) + e.key("properties") + r.properties(v) + e.key("note") + e.b = append(e.b, '"') + return e.b +} + +// properties writes every value type JSON has - text, number, true or false, +// null, an array and an object - the same set the json format carries, so an +// import that turns properties into columns meets each of them. The note comes +// last and is left open. +func (r *records) properties(v values) { + e := &r.e + e.open('{') + e.key("name") + e.text(v.name) + e.key("amount") + e.whole(v.whole) + e.b = append(e.b, '.', byte('0'+v.cents/10), byte('0'+v.cents%10)) + e.key("active") + e.b = strconv.AppendBool(e.b, v.active) + e.key("retired") + e.b = append(e.b, "null"...) + e.key("tags") + e.open('[') + e.next() + e.text(v.tagA) + e.next() + e.text(v.tagB) + e.close(']') + e.key("address") + e.open('{') + e.key("city") + e.text(v.city) + e.key("zip") + e.b = append(e.b, '"') + e.whole(v.zip) + e.b = append(e.b, '"') + e.close('}') +} + +// shut closes the note, the properties and the feature. +func (r *records) shut(dst []byte) []byte { + r.e.b = append(dst, '"') + r.e.close('}') + r.e.close('}') + return r.e.b +} + +// appendPhrase writes a readable note of n words. Words and single spaces +// only - a JSON string would otherwise need escaping, and an escape costs a +// byte the size arithmetic did not budget for. +func appendPhrase(dst []byte, rng *rand.Rand, n int) []byte { + for i := 0; i < n; i++ { + if i > 0 { + dst = append(dst, ' ') + } + dst = append(dst, word(rng)...) + } + return dst +} + +// appendSpaces writes n spaces, in pieces, because n can be tens of megabytes. +func appendSpaces(dst []byte, n int64) []byte { + for ; n > 0; n -= int64(len(indentation)) { + dst = append(dst, indentation[:min(n, int64(len(indentation)))]...) + } + return dst +} + +func word(rng *rand.Rand) string { return words[rng.IntN(len(words))] } + +// longestWord is the widest draw, because the minimum has to hold for every +// draw rather than for the lucky one. +var longestWord = func() string { + longest := "" + for _, w := range words { + if len(w) > len(longest) { + longest = w + } + } + return longest +}() + +// words is the vocabulary for names, tags, cities and notes: places and things +// a map of a service area would mark. +var words = []string{ + "airfield", "anchorage", "bakery", "bridge", "canal", "carpark", "checkpoint", + "clinic", "crossing", "dairy", "depot", "dock", "factory", "farm", "ferry", + "field", "garage", "harbour", "hospital", "hostel", "junction", "kiosk", + "landing", "library", "lighthouse", "market", "mill", "museum", "office", + "orchard", "outpost", "pharmacy", "pier", "plant", "quarry", "reservoir", + "school", "shelter", "siding", "station", "storage", "substation", "terminal", + "tower", "tunnel", "viaduct", "warehouse", "wharf", "workshop", "yard", +} diff --git a/internal/format/geojson/geojson.go b/internal/format/geojson/geojson.go new file mode 100644 index 00000000..d0f0b5ac --- /dev/null +++ b/internal/format/geojson/geojson.go @@ -0,0 +1,131 @@ +// Package geojson generates GeoJSON documents (RFC 7946): a FeatureCollection +// of features, each with a geometry and a set of properties. +// +// What makes this format worth its place is what a map application does with +// a file that is valid and still hard: every one of the seven geometry types, +// a million points in one outline, coordinates with fifteen decimal places, a +// height on every position, an outline wound the other way round, a shape that +// crosses the 180th meridian without being cut. RFC 7946 tells readers to +// accept all of them and readers do not agree on what they mean. +// docs/GEOJSON-2026-10-07.md has the measurement this is built on. +package geojson + +import ( + "context" + "fmt" + "io" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" + "github.com/donislawdev/TestingFilesGenerator/internal/format" +) + +const generatorVersion = "1" + +// The padding goes where the json format puts it, for the reason given there: +// whole features fill the file, and the note of the last one takes the +// remainder, so a large file is a large amount of geometry rather than a small +// one with a long tail. The one difference is noteCap - see feature.go. + +func init() { + format.Register(format.Descriptor{ + ID: "geojson", + Name: "GeoJSON", + Extension: ".geojson", + Fidelity: format.FidelityFull, + Determinism: format.DeterminismByte, + + // An empty FeatureCollection is legal GeoJSON, and nobody orders one + // by naming a byte count - the minimum is the collection and one whole + // feature. The DEFAULT settings' minimum, the way json declares its + // default layout's. Every other combination answers for itself, through + // the same refusal, and SmallestAccepted asks the generator. + MinBytes: minimumBytes(defaultSettings()), + + Padding: format.PaddingChannel{ + Name: "the note value of the last feature, then spaces after it once the note reaches 1 MiB", + Where: format.PlacementEnd, + Capacity: 0, + }, + + // The label never reaches the content. An extra member changes the + // structure under test, the reason json gives too. The file name and + // the manifest carry it instead. + Label: format.LabelExternalOnly, + Oracle: "gdal-geojson", + Properties: properties(), + GeneratorVersion: generatorVersion, + Generator: generator{}, + }) +} + +type generator struct{} + +type memo struct { + seed uint64 + s settings +} + +func defaultSettings() settings { + s, err := parse(nil) + if err != nil { + panic(fmt.Sprintf("geojson: the default settings do not parse: %v", err)) + } + return s +} + +// minimumBytes is what opens the collection and the largest closing feature +// the settings can draw, measured rather than written down. +func minimumBytes(s settings) int64 { + return int64(len(s.layout.prologue)) + newRecords(s).Shortest() +} + +func (generator) Plan(r format.Request) (format.Plan, error) { + s, err := parse(r.Properties) + if err != nil { + return format.Plan{}, err + } + if most := mostPoints(s.kinds, gridFor(s.precision)); int64(s.vertices) > most { + return format.Plan{}, refuseCrowded(s, most) + } + if min := minimumBytes(s); r.Bytes < min { + return format.Plan{}, &format.BelowMinimumError{ + Format: "GeoJSON", + Requested: r.Bytes, + Minimum: min, + Reason: core.Says("geojson.ACollectionHoldsWholeFeatures", "a collection holds whole features, and the largest one these settings can draw needs that much"), + Hint: core.Says("format.AskForBOrMore", "Ask for %d B or more.", core.A("Min", min)), + } + } + return format.Plan{ + Bytes: r.Bytes, + Exact: true, + Determinism: format.DeterminismByte, + Properties: map[string]any{ + "encoding": "utf-8", + "root": "FeatureCollection", + Geometry: s.geometry, + Formatting: s.layout.name, + Precision: s.precision, + Altitude: s.altitude, + Vertices: s.vertices, + Winding: s.winding(), + Antimeridian: s.antimeridian, + // Stated even though it is always false here, so a test can assert + // on it without knowing which formats carry a label internally. + format.PropertyLabelEmbedded: false, + }, + Memo: memo{seed: r.Seed, s: s}, + }, nil +} + +func (generator) Write(ctx context.Context, w io.Writer, p format.Plan) error { + m, ok := p.Memo.(memo) + if !ok { + return core.Defect(fmt.Errorf("geojson: the plan was not produced by this generator")) + } + prologue := m.s.layout.prologue + if err := core.WriteAll(w, []byte(prologue)); err != nil { + return err + } + return core.FillRecords(ctx, w, core.NewRand(m.seed), p.Bytes-int64(len(prologue)), newRecords(m.s)) +} diff --git a/internal/format/geojson/geometry.go b/internal/format/geojson/geometry.go new file mode 100644 index 00000000..9f852cd4 --- /dev/null +++ b/internal/format/geojson/geometry.go @@ -0,0 +1,112 @@ +package geojson + +// geometry writes the geometry object of kind k from the drawing already made. +func (r *records) geometry(k kind) { + e := &r.e + e.open('{') + e.key("type") + e.text(typeName[k]) + if k == kindCollection { + e.key("geometries") + e.open('[') + for j, p := range pieces[k] { + e.next() + r.member(p, j) + } + e.close(']') + } else { + e.key("coordinates") + r.coordinates(k) + } + e.close('}') +} + +// member is one geometry of a collection, written as the single geometry its +// piece makes. +func (r *records) member(p piece, j int) { + e := &r.e + e.open('{') + e.key("type") + e.text(typeName[pieceKind[p]]) + e.key("coordinates") + r.piece(p, j) + e.close('}') +} + +// pieceKind is the single geometry each piece makes on its own. +var pieceKind = [...]kind{piecePoint: kindPoint, pieceLine: kindLine, pieceRing: kindPolygon} + +// coordinates is the coordinates member of every kind but a collection. A +// MultiLineString and a MultiPolygon are an array of what one part would +// write. A MultiPoint is a line's points without the line, which is the same +// array of positions. +func (r *records) coordinates(k kind) { + if k != kindMultiLine && k != kindMultiPolygon { + r.piece(pieces[k][0], 0) + return + } + r.e.open('[') + for j, p := range pieces[k] { + r.e.next() + r.piece(p, j) + } + r.e.close(']') +} + +// piece writes piece j of the drawing: a position for a point, an array of +// positions for a line, and an array holding one ring for an outline. +func (r *records) piece(p piece, j int) { + from := 0 + if j > 0 { + from = r.d.ends[j-1] + } + to := r.d.ends[j] + switch p { + case piecePoint: + r.position(from) + case pieceLine: + r.run(from, to, false) + case pieceRing: + r.e.open('[') + r.e.next() + r.run(from, to, r.s.reversed) + r.e.close(']') + } +} + +// run is the positions from one index to another, walked backwards for an +// outline asked for clockwise. The first and last positions of an outline are +// the same, so it stays closed either way round. +func (r *records) run(from, to int, backwards bool) { + r.e.open('[') + for i := range to - from { + at := from + i + if backwards { + at = to - 1 - i + } + r.e.next() + r.position(at) + } + r.e.close(']') +} + +// position writes one position: longitude, latitude and, with altitude, the +// height. A longitude drawn past 180 degrees is written on the other side of +// the antimeridian, which is what crossing it without being cut looks like. +func (r *records) position(i int) { + e := &r.e + p := r.d.pos[i*r.d.stride : (i+1)*r.d.stride] + x := p[0] + if x > r.g.lon { + x -= 2 * r.g.lon + } + e.open('[') + for j, v := range p { + if j == 0 { + v = x + } + e.next() + e.fixed(v, r.g.places, r.g.scale) + } + e.close(']') +} diff --git a/internal/format/geojson/layout.go b/internal/format/geojson/layout.go new file mode 100644 index 00000000..f6f70b6e --- /dev/null +++ b/internal/format/geojson/layout.go @@ -0,0 +1,155 @@ +package geojson + +import "strconv" + +// layout is what stands around the features: what opens the collection, what +// goes before and after each feature, and what closes it. +// +// The features themselves go through emitter, which knows only whether to +// indent. Unlike the json format, whose records are flat enough to be held as +// literals, a feature here nests to a depth that depends on its geometry - a +// polygon's numbers sit two arrays deeper than a point's - so the whitespace is +// worked out per token rather than written down per field. +type layout struct { + name string + indent bool + prologue string + start string + between string + epilogue string +} + +// featureDepth is how deep a feature sits: inside the collection and inside +// its features array. Indented, that is four spaces before its brace. +const featureDepth = 2 + +var layouts = map[string]layout{ + // One feature on each line, the shape a tester can split, count and diff + // line by line. + RecordPerLine: { + name: RecordPerLine, + prologue: `{"type":"FeatureCollection","features":[` + "\n", + between: ",\n", + epilogue: "\n]}\n", + }, + // No whitespace anywhere and no newline at the end, the same promise the + // json format makes for the same word. + Minified: { + name: Minified, + prologue: `{"type":"FeatureCollection","features":[`, + between: ",", + epilogue: "]}", + }, + // What JSON.stringify(x, null, 2) and json.dumps(x, indent=2) write: two + // spaces a level and every value on its own line, every coordinate number + // included. That is what makes it worth having - the same features are + // several times larger, and a file a person opens in an editor often looks + // exactly like this. + Indented: { + name: Indented, + indent: true, + prologue: "{\n \"type\": \"FeatureCollection\",\n \"features\": [\n", + start: " ", + between: ",\n", + epilogue: "\n ]\n}\n", + }, +} + +// emitter appends JSON tokens with the whitespace its layout asks for. +// +// It appends into one slice rather than writing to a stream, because a closing +// feature has to be measured before its note is written, and because one +// allocation per token over a file of millions of numbers is a multiple of the +// file in garbage. +type emitter struct { + b []byte + indent bool + depth int + // fresh is true right after a container opens, before its first element, + // which is the one element not preceded by a comma. + fresh bool +} + +// indentation is enough spaces for the deepest token a feature has, with room +// to spare: a number inside a position inside a ring inside the polygon of a +// geometry collection sits nine levels down, eighteen spaces. +const indentation = " " + +func (e *emitter) newline() { + e.b = append(e.b, '\n') + e.b = append(e.b, indentation[:2*e.depth]...) +} + +// next is what comes before any element of a container - a member of an object +// or a value of an array. +func (e *emitter) next() { + if !e.fresh { + e.b = append(e.b, ',') + } + e.fresh = false + if e.indent { + e.newline() + } +} + +func (e *emitter) open(c byte) { + e.b = append(e.b, c) + e.depth++ + e.fresh = true +} + +// close ends a container. Every container a feature opens has at least one +// element, so an empty one never needs its own spelling. +func (e *emitter) close(c byte) { + e.depth-- + if e.indent { + e.newline() + } + e.fresh = false + e.b = append(e.b, c) +} + +func (e *emitter) key(k string) { + e.next() + e.b = append(e.b, '"') + e.b = append(e.b, k...) + e.b = append(e.b, '"', ':') + if e.indent { + e.b = append(e.b, ' ') + } +} + +// text is a string value. Every string this format writes is a word from the +// vocabulary or a run of them, none of which needs escaping. +func (e *emitter) text(v string) { + e.b = append(e.b, '"') + e.b = append(e.b, v...) + e.b = append(e.b, '"') +} + +func (e *emitter) whole(v int64) { e.b = strconv.AppendInt(e.b, v, 10) } + +// fixed writes v, a count of steps of 10^-places, as a decimal with exactly +// that many places, from whole numbers only. +// +// A coordinate is held as a count of grid steps rather than as a float, so +// what is written is the geometry itself rather than a rounding of it. A +// rounding can turn a simple outline into one that crosses itself, and a float +// formatted on one machine is not promised to match another (D11). +func (e *emitter) fixed(v int64, places int, scale int64) { + if v < 0 { + e.b = append(e.b, '-') + v = -v + } + e.b = strconv.AppendInt(e.b, v/scale, 10) + if places == 0 { + return + } + e.b = append(e.b, '.') + frac := v % scale + // Leading zeros of the fraction: a value of 5 at three places is .005. + for lead := scale / 10; lead > frac && lead > 1; lead /= 10 { + e.b = append(e.b, '0') + } + e.b = strconv.AppendInt(e.b, frac, 10) +} diff --git a/internal/format/geojson/settings.go b/internal/format/geojson/settings.go new file mode 100644 index 00000000..774a42a4 --- /dev/null +++ b/internal/format/geojson/settings.go @@ -0,0 +1,201 @@ +package geojson + +import ( + "strconv" + + "github.com/donislawdev/TestingFilesGenerator/internal/core" + "github.com/donislawdev/TestingFilesGenerator/internal/format" +) + +// Setting names. Public names, so each is spelled once. +const ( + Geometry = "geometry" + Formatting = "formatting" + Precision = "precision" + Altitude = "altitude" + Vertices = "vertices" + Winding = "winding" + Antimeridian = "antimeridian" +) + +// The values of geometry, spelled as a recipe spells them: the RFC 7946 type +// names in lower case, and mixed for all seven in turn. +const ( + Mixed = "mixed" + Point = "point" + LineString = "linestring" + Polygon = "polygon" + MultiPoint = "multipoint" + MultiLineString = "multilinestring" + MultiPolygon = "multipolygon" + GeometryCollection = "geometrycollection" +) + +// The values of winding. +const ( + RFC7946 = "rfc7946" + Reversed = "reversed" +) + +// The values of formatting - the same three names the json format takes, so a +// person who learnt them there meets the same words here, and a window keeps +// one translation of each. +const ( + Indented = "indented" + Minified = "minified" + RecordPerLine = "record-per-line" +) + +const ( + defaultPrecision = 6 + maxPrecision = 15 + + defaultVertices = 8 + // Three is the fewest that makes an outline - a triangle - and a line of + // three still bends. + minVertices = 3 + // A million points in one ring is the size that breaks things: measured + // 2026-10-07, one such ring is 16 MB of text, read by GDAL in one feature. + maxVertices = 1_000_000 +) + +// settings is every choice a file is made with, read once in Plan. +type settings struct { + geometry string + kinds []kind + layout layout + precision int + altitude bool + vertices int + reversed bool + antimeridian bool +} + +// parse reads the settings a request carries. +// +// A value outside the declaration has already been refused by the registry, +// which checks every format in one place. The check stays here for the reason +// the json layout keeps its own: the function is callable directly, a guard is +// such a caller, and a generator that trusts its input is one registry change +// away from writing a file nobody ordered. +// +// Read by name rather than by position in the declaration, so reordering the +// list a person sees cannot hand one setting's value to another. +func parse(props map[string]string) (settings, error) { + values := map[string]string{} + for _, p := range properties() { + v, err := valueOf(props, p) + if err != nil { + return settings{}, err + } + values[p.Name] = v + } + // Both have passed their declared range in valueOf, so neither can fail. + precision, _ := strconv.Atoi(values[Precision]) + vertices, _ := strconv.Atoi(values[Vertices]) + return settings{ + geometry: values[Geometry], + kinds: kindsOf(values[Geometry]), + layout: layouts[values[Formatting]], + precision: precision, + altitude: values[Altitude] == "true", + vertices: vertices, + reversed: values[Winding] == Reversed, + antimeridian: values[Antimeridian] == "true", + }, nil +} + +// winding is the value of winding the file was made with. +func (s settings) winding() string { + if s.reversed { + return Reversed + } + return RFC7946 +} + +// valueOf is one setting's value, or its default, refused in the +// declaration's own words when the declaration does not allow it. +func valueOf(props map[string]string, p format.Property) (string, error) { + v, ok := props[p.Name] + if !ok || v == "" { + return p.Default, nil + } + if bad := p.Allows(v); !bad.IsZero() { + return "", &format.PropertyValueError{Format: "geojson", Key: p.Name, Value: v, Reason: bad, Remedy: p.Instead()} + } + return v, nil +} + +// properties is the declaration, in the order parse reads it and a person +// meets it. +func properties() []format.Property { + return []format.Property{ + { + Name: Geometry, Kind: format.PropertyChoice, + // In order, as every closed set is registered. The turns mixed + // takes follow RFC 7946 instead - see everyKind. + Choices: []string{GeometryCollection, LineString, Mixed, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon}, + Default: Mixed, + Detail: "Which kind of geometry each feature carries. With mixed the seven kinds take turns, so a file of seven features or more holds every one of them.", + }, + { + Name: Formatting, Kind: format.PropertyChoice, + Choices: []string{Indented, Minified, RecordPerLine}, + Default: RecordPerLine, + Detail: "How the document is laid out. Every reader accepts all three - minified puts the whole file on one line and ends without a newline, and indented puts every number on its own line, which makes the same features several times larger.", + }, + { + Name: Precision, Kind: format.PropertyInt, + Min: 0, Max: maxPrecision, Unit: "decimal places", + Default: strconv.Itoa(defaultPrecision), + Detail: "How many decimal places every coordinate is written with. Six is about ten centimetres on the ground, the figure RFC 7946 gives.", + }, + { + Name: Altitude, Kind: format.PropertyBool, + Default: "false", + Detail: "Whether every position carries a third number, the height in metres from -400 to 8848. A program that reads two numbers a position has to ignore it or refuse the file.", + }, + { + Name: Vertices, Kind: format.PropertyInt, + Min: minVertices, Max: maxVertices, Unit: "points", + Default: strconv.Itoa(defaultVertices), + Detail: "How many points every line, outline and MultiPoint has. A feature larger than 1 MiB is followed by spaces that fill the last bytes, and at precision 3 or less fewer points fit, because each needs its own step of longitude.", + }, + { + Name: Winding, Kind: format.PropertyChoice, + Choices: []string{Reversed, RFC7946}, + Default: RFC7946, + Detail: "Which way polygon outlines run - rfc7946 is counter-clockwise and reversed is clockwise. RFC 7946 tells readers to accept both, and they disagree about which side of the outline is inside. Points and lines do not change.", + }, + { + Name: Antimeridian, Kind: format.PropertyBool, + Default: "false", + Detail: "Whether every line and outline crosses the 180th meridian without being cut in two. RFC 7946 asks for such shapes to be cut, and readers differ - read as flat coordinates, a crossing outline crosses itself and runs the other way round. A single point cannot cross and is placed beside it.", + }, + } +} + +// refuseCrowded is the refusal for more points than the globe has steps of +// longitude at the precision asked for. +// +// Not a JointLimit, because a JointLimit is a product of two settings and this +// is a count against a power of ten. Said in the same four parts all the same, +// with what to do inside the reason the way the picture formats say theirs, +// because the reason is the part the command line prints. +// +// Keyed by vertices alone, so a window puts it under the box that holds the +// number to change. +func refuseCrowded(s settings, most int64) error { + return &format.PropertyValueError{ + Format: "geojson", Key: Vertices, Value: strconv.Itoa(s.vertices), + Reason: core.Says("geojson.EachPointNeedsAStep", + "each point needs its own step of longitude, and at precision %d the globe has room for %d - ask for that many or fewer, or for a higher precision", + core.A("Precision", s.precision), core.A("Most", most)), + // The same advice again on its own, for the reader that asks for the + // parts by name - tfg validate --json puts it under fix, which was + // empty without it (review of #171). The command line prints the + // reason, so the advice stays there as well. + Remedy: core.Says("geojson.AskForFewerPoints", + "Ask for %d points or fewer, or for a higher precision.", core.A("Most", most)), + } +} diff --git a/internal/format/geojson/shape.go b/internal/format/geojson/shape.go new file mode 100644 index 00000000..b864bc90 --- /dev/null +++ b/internal/format/geojson/shape.go @@ -0,0 +1,322 @@ +package geojson + +import ( + // D11 promises the same bytes from the same seed, so a deliberate, + // reproducible generator is the product rather than a weakness. Nothing + // here ever makes a secret. + // nosemgrep: go.lang.security.audit.crypto.math_random.math-random-used + "math/rand/v2" + "slices" +) + +// kind is one of the seven geometry types of RFC 7946. +type kind int + +const ( + kindPoint kind = iota + kindLine + kindPolygon + kindMultiPoint + kindMultiLine + kindMultiPolygon + kindCollection +) + +// typeName is how each kind is written in the file. +var typeName = [...]string{ + kindPoint: "Point", + kindLine: "LineString", + kindPolygon: "Polygon", + kindMultiPoint: "MultiPoint", + kindMultiLine: "MultiLineString", + kindMultiPolygon: "MultiPolygon", + kindCollection: "GeometryCollection", +} + +var kindOf = map[string]kind{ + Point: kindPoint, + LineString: kindLine, + Polygon: kindPolygon, + MultiPoint: kindMultiPoint, + MultiLineString: kindMultiLine, + MultiPolygon: kindMultiPolygon, + GeometryCollection: kindCollection, +} + +// everyKind is mixed: all seven, in the order RFC 7946 introduces them. +var everyKind = []kind{kindPoint, kindLine, kindPolygon, kindMultiPoint, kindMultiLine, kindMultiPolygon, kindCollection} + +func kindsOf(geometry string) []kind { + if geometry == Mixed { + return everyKind + } + return []kind{kindOf[geometry]} +} + +// piece is what a geometry is drawn from. A MultiPoint is drawn as a line's +// points and written without the line, which is why there is no fourth piece. +type piece int + +const ( + piecePoint piece = iota + pieceLine + pieceRing +) + +// pieces is what each kind is drawn from, one band of latitude each, from the +// bottom up. A multi geometry has two parts, and a collection holds one point, +// one line and one polygon. +var pieces = [...][]piece{ + kindPoint: {piecePoint}, + kindLine: {pieceLine}, + kindPolygon: {pieceRing}, + kindMultiPoint: {pieceLine}, + kindMultiLine: {pieceLine, pieceLine}, + kindMultiPolygon: {pieceRing, pieceRing}, + kindCollection: {piecePoint, pieceLine, pieceRing}, +} + +// grid is the precision as whole numbers: a coordinate is a count of steps of +// 10^-places degrees, and a height a count of the same steps of a metre. +type grid struct { + places int + scale int64 + lon int64 // 180 degrees + lat int64 // 85 degrees + low int64 // -400 metres + high int64 // 8848 metres +} + +// lowestLand and highestLand are the heights a position may carry: a little +// below the shore of the Dead Sea and the top of Everest. +const ( + lowestLand = -400 + highestLand = 8848 + // widestLatitude keeps every shape inside the band a web map in the Web + // Mercator projection can show, which ends just past 85 degrees. + widestLatitude = 85 +) + +func gridFor(places int) grid { + scale := int64(1) + for i := 0; i < places; i++ { + scale *= 10 + } + return grid{places: places, scale: scale, lon: 180 * scale, lat: widestLatitude * scale, + low: lowestLand * scale, high: highestLand * scale} +} + +// room is the widest a shape may be, in steps of longitude: short of the whole +// globe by a step on each side, so a shape never meets itself round the back. +func (g grid) room() int64 { return 2*g.lon - 2 } + +// needs is the fewest steps of longitude a piece of n points spans. A line +// moves right at every point. An outline goes right along the bottom and back +// left along the top, so it needs room for the longer of its two halves. +func needs(p piece, n int64) int64 { + switch p { + case pieceLine: + return n - 1 + case pieceRing: + return (n - 2) - (n-2)/2 + 1 + default: + return 0 + } +} + +func widest(ps []piece, n int64) int64 { + var most int64 + for _, p := range ps { + most = max(most, needs(p, n)) + } + return most +} + +// mostPoints is the largest vertices the globe has room for at this precision, +// given the kinds a file draws - needs turned round, for the piece that needs +// the most. Points alone use no vertices at all, so they set no limit. +func mostPoints(kinds []kind, g grid) int64 { + switch { + case draws(kinds, pieceLine): + return g.room() + 1 + case draws(kinds, pieceRing): + return 2 * g.room() + default: + return maxVertices + } +} + +func draws(kinds []kind, p piece) bool { + for _, k := range kinds { + if slices.Contains(pieces[k], p) { + return true + } + } + return false +} + +// drawing is one geometry's positions, unwrapped: a longitude past 180 stays +// past it here and is wrapped only when written, so the shape can be built and +// checked as one piece wherever it lies. +type drawing struct { + pos []int64 // x, y and, with altitude, z + ends []int // where each piece ends, counted in positions + stride int + + // What one feature is drawn with, set by draw so the functions that draw + // its pieces do not carry it in every call. + rng *rand.Rand + g grid + altitude bool +} + +// box is the space one geometry is drawn in. +type box struct { + x0, w int64 // the left edge and the width, in steps of longitude + h int64 // how far a piece reaches above and below its middle +} + +// draw makes the geometry of one feature. +// +// Every shape is simple by construction rather than by luck: a line moves +// right at every point, and an outline runs right along the bottom below its +// middle and back left along the top above it, so the two halves meet only at +// their ends. The parts of a multi geometry sit in separate bands of latitude, +// so they never overlap. Nothing is checked after the fact, because nothing +// can go wrong that a check would have to catch. +func (d *drawing) draw(rng *rand.Rand, s settings, g grid, k kind) { + d.reset(s) + d.rng, d.g, d.altitude = rng, g, s.altitude + ps := pieces[k] + n := int64(s.vertices) + b := box{w: max(widest(ps, n), g.scale/5+rng.Int64N(g.scale*4/5+1))} + if s.antimeridian { + b.w = max(b.w, 2) + } + b.h = max(1, g.scale/20+rng.Int64N(g.scale/5+1)) + pitch := 2*b.h + 3 + if s.antimeridian { + // Starting at least a step short of 180 and ending at least a step past + // it, so every line and outline crosses. + b.x0 = g.lon - b.w + 1 + rng.Int64N(b.w-1) + } else { + b.x0 = -g.lon + rng.Int64N(2*g.lon-b.w+1) + } + y0 := -g.lat + rng.Int64N(2*g.lat-int64(len(ps))*pitch+1) + for j, p := range ps { + c := y0 + int64(j)*pitch + b.h + 1 + switch p { + case piecePoint: + d.add(b.x0+rng.Int64N(b.w+1), c-b.h+rng.Int64N(2*b.h+1)) + case pieceLine: + d.line(b, c, n) + case pieceRing: + d.ring(b, c, n) + } + d.ends = append(d.ends, len(d.pos)/d.stride) + } +} + +func (d *drawing) reset(s settings) { + d.pos = d.pos[:0] + d.ends = d.ends[:0] + d.stride = 2 + if s.altitude { + d.stride = 3 + } +} + +func (d *drawing) add(x, y int64) { + d.pos = append(d.pos, x, y) + if d.altitude { + d.pos = append(d.pos, height(d.rng, d.g)) + } +} + +// height is a height between the lowest and the highest, drawn as an unsigned +// count. At fifteen places the span is 9248 * 10^15 steps, past the largest +// int64 - found 2026-10-07, when Int64N was handed the overflow and stopped the +// run. Every height itself fits, so the sum wraps back into range. +func height(rng *rand.Rand, g grid) int64 { + span := uint64(g.high) + uint64(-g.low) + 1 + return int64(uint64(g.low) + rng.Uint64N(span)) +} + +// line is n points, each a step or more right of the one before, the first on +// the left edge of the box. +func (d *drawing) line(b box, c, n int64) { + step := b.w / (n - 1) + for i := int64(0); i < n; i++ { + x := b.x0 + i*step + if i > 0 && i < n-1 { + x += d.rng.Int64N(step) + } + d.add(x, c-b.h+d.rng.Int64N(2*b.h+1)) + } +} + +// ring is a closed outline of n points, counter-clockwise: from the left end +// right along the bottom, below the middle, to the right end, back left along +// the top, above the middle, and the first position again. RFC 7946 asks for +// the last position to repeat the first exactly, height included. +func (d *drawing) ring(b box, c, n int64) { + first := len(d.pos) + bottom := (n - 2) / 2 + top := n - 2 - bottom + d.add(b.x0, c) + d.half(b, bottom, c-1, -1) + d.add(b.x0+b.w, c) + from := len(d.pos) + d.half(b, top, c+1, 1) + // Drawn left to right like the bottom, and walked right to left. + d.reverse(from) + d.pos = append(d.pos, d.pos[first:first+d.stride]...) +} + +// half is the points strictly between the two ends of an outline, from left to +// right, each in a slot of its own so no two share a longitude. edge is the +// row nearest the middle and sign the side of it they keep to. +func (d *drawing) half(b box, count, edge, sign int64) { + slot := b.w / (count + 1) + for i := int64(0); i < count; i++ { + x := b.x0 + i*slot + 1 + d.rng.Int64N(slot) + d.add(x, edge+sign*d.rng.Int64N(b.h)) + } +} + +// reverse turns round the positions from index from to the end. +func (d *drawing) reverse(from int) { + st := d.stride + for i, j := from, len(d.pos)-st; i < j; i, j = i+st, j-st { + for k := 0; k < st; k++ { + d.pos[i+k], d.pos[j+k] = d.pos[j+k], d.pos[i+k] + } + } +} + +// worst fills the drawing with the widest numbers every position can be +// written with, in the counts kind k has. It is what the smallest closing +// feature is measured from, and it has to be at least as long as every draw. +func (d *drawing) worst(s settings, g grid, k kind) { + d.reset(s) + widest := []int64{-g.lon, -g.lat, g.low}[:d.stride] + for _, p := range pieces[k] { + for i := 0; i < positions(p, s.vertices); i++ { + d.pos = append(d.pos, widest...) + } + d.ends = append(d.ends, len(d.pos)/d.stride) + } +} + +// positions is how many positions a piece of n points writes. An outline +// repeats its first point at the end. +func positions(p piece, n int) int { + switch p { + case pieceLine: + return n + case pieceRing: + return n + 1 + default: + return 1 + } +} diff --git a/internal/guard/formatlist_test.go b/internal/guard/formatlist_test.go index c7865ecb..da9070ce 100644 --- a/internal/guard/formatlist_test.go +++ b/internal/guard/formatlist_test.go @@ -207,9 +207,11 @@ func TestTypingIntoTheFormatListNarrowsItAndLandsOnWhatStartsWithIt(t *testing.T // TestTheArrowsInTheFormatListStepOverTheHeadings walks a narrowed list. // -// "j" leaves jpg and jxl under one heading and json under another, so Down -// from jxl has a heading in its way - the cost the deferral of 2026-08-25 -// wrote down, before there were any headings to step over. +// "j" leaves jpg and jxl under one heading and geojson and json under another, +// so Down from jxl has a heading in its way - the cost the deferral of +// 2026-08-25 wrote down, before there were any headings to step over. geojson +// joined the second heading on 2026-10-07, and the walk goes through it both +// ways rather than around it. func TestTheArrowsInTheFormatListStepOverTheHeadings(t *testing.T) { _, _, list, filter := openFormatList(t) typeInto(filter, "j") @@ -218,8 +220,10 @@ func TestTheArrowsInTheFormatListStepOverTheHeadings(t *testing.T) { want string }{ {fyne.KeyDown, "jxl"}, + {fyne.KeyDown, "geojson"}, {fyne.KeyDown, "json"}, {fyne.KeyDown, "json"}, + {fyne.KeyUp, "geojson"}, {fyne.KeyUp, "jxl"}, {fyne.KeyUp, "jpg"}, {fyne.KeyUp, "jpg"}, diff --git a/internal/guard/generatorbytes_test.go b/internal/guard/generatorbytes_test.go index d8d46205..973fbd17 100644 --- a/internal/guard/generatorbytes_test.go +++ b/internal/guard/generatorbytes_test.go @@ -352,6 +352,21 @@ func goldenCases() map[string]engine.Target { "toml_8kib": {ID: "g", Format: "toml", Sizes: engine.Uniform(1, 8192), Label: true}, "toml_8kib_no_label": {ID: "g", Format: "toml", Sizes: engine.Uniform(1, 8192), Label: false}, + // GeoJSON, one case for each path the bytes take rather than one for + // each setting: the three layouts, whole degrees (no decimal point at + // all), every pitfall at once with fifteen places - the wrap across the + // antimeridian, the reversed outline and the height whose span passes + // an int64 - and a note capped at a mebibyte with spaces after it. The + // label never reaches the content, so it is pinned in one position. + "geojson_8kib": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 8192), Label: true}, + "geojson_8kib_minified": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 8192), Label: true, Properties: map[string]string{"formatting": "minified"}}, + "geojson_8kib_indented": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 8192), Label: true, Properties: map[string]string{"formatting": "indented"}}, + "geojson_8kib_whole_degrees": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 8192), Label: true, Properties: map[string]string{"precision": "0"}}, + "geojson_8kib_every_pitfall": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 8192), Label: true, + Properties: map[string]string{"antimeridian": "true", "winding": "reversed", "altitude": "true", "precision": "15"}}, + "geojson_capped_note": {ID: "g", Format: "geojson", Sizes: engine.Uniform(1, 3900000), Label: true, + Properties: map[string]string{"geometry": "polygon", "vertices": "100000"}}, + // The label is a byte affecting switch, not a cosmetic one, so it is // pinned in both positions. "txt_4kib_no_label": {ID: "g", Format: "txt", Sizes: engine.Uniform(1, 4096), Label: false}, diff --git a/internal/guard/geojson_test.go b/internal/guard/geojson_test.go new file mode 100644 index 00000000..d57efc6f --- /dev/null +++ b/internal/guard/geojson_test.go @@ -0,0 +1,245 @@ +package guard + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "testing" + + "github.com/donislawdev/TestingFilesGenerator/internal/format" + "github.com/donislawdev/TestingFilesGenerator/internal/format/geojson" + "github.com/donislawdev/TestingFilesGenerator/internal/oracle" +) + +// geojsonCases is every value of every setting, one at a time, and the +// combinations measured on 2026-10-07 to be the ones where the drawing is at +// its tightest: three points across the antimeridian, a line of the most points +// a whole-degree grid has room for, and every pitfall at once in the layout +// that puts each number on its own line. +var geojsonCases = []map[string]string{ + {}, + {geojson.Geometry: geojson.Point}, + {geojson.Geometry: geojson.LineString}, + {geojson.Geometry: geojson.Polygon}, + {geojson.Geometry: geojson.MultiPoint}, + {geojson.Geometry: geojson.MultiLineString}, + {geojson.Geometry: geojson.MultiPolygon}, + {geojson.Geometry: geojson.GeometryCollection}, + {geojson.Formatting: geojson.Minified}, + {geojson.Formatting: geojson.Indented}, + {geojson.Precision: "0"}, + {geojson.Precision: "15"}, + {geojson.Altitude: "true"}, + {geojson.Vertices: "3"}, + {geojson.Vertices: "4"}, + {geojson.Vertices: "5"}, + {geojson.Winding: geojson.Reversed}, + {geojson.Antimeridian: "true"}, + {geojson.Antimeridian: "true", geojson.Winding: geojson.Reversed, geojson.Altitude: "true", geojson.Formatting: geojson.Indented}, + // Fifteen places and a height: the span of heights is then 9248 * 10^15 + // steps, past the largest int64, and the first build stopped every such run + // with an internal error (found 2026-10-07 by the golden value probe, with + // every case here green). + {geojson.Precision: "15", geojson.Altitude: "true"}, + {geojson.Vertices: "3", geojson.Antimeridian: "true"}, + {geojson.Precision: "0", geojson.Vertices: "359", geojson.Geometry: geojson.LineString}, + {geojson.Precision: "0", geojson.Antimeridian: "true"}, +} + +// Three readers, three questions. GDAL is the reader a GIS tester has, and it +// has to read every feature with nothing on standard error. shapely has to +// call every geometry valid, which GDAL never asks. The structural checker is +// told the settings and has to find the file made the way they say - the +// decimal places, the winding, the crossing, the layout byte for byte. Each of +// them alone was measured letting through what another catches +// (docs/GEOJSON-2026-10-07.md section 3). +// +// Named to match ReferenceTool, because that is the one job in CI with GDAL and +// shapely installed. Anywhere else it skips, and says so. +func TestEveryGeoJSONSettingSurvivesItsReferenceTool(t *testing.T) { + d, err := format.Get("geojson") + if err != nil { + t.Fatal(err) + } + gdal := mustOracle(t, d) + dir := t.TempDir() + for i, props := range geojsonCases { + smallest := d.SmallestAccepted(format.Request{Properties: props}) + for _, size := range []int64{smallest, smallest + 1, 20000} { + path := filepath.Join(dir, strconv.Itoa(i)+"_"+strconv.FormatInt(size, 10)+".geojson") + features := writeGeoJSON(t, path, size, uint64(31+i), props) + + res := gdal.Check(path) + if !res.Available { + t.Skipf("%s is not installed, so no file was read by GDAL - a skip, not a pass", res.Tool) + } + if res.Err != nil { + t.Fatalf("%v at %d B: %v", props, size, res.Err) + } + if got := oracle.GDALFeatures(res.Output); got != features { + t.Fatalf("%v at %d B: GDAL read %d features and the file holds %d", props, size, got, features) + } + if v := oracle.ShapelyValid(path, props[geojson.Antimeridian] == "true"); !v.Available { + t.Skipf("%s is not installed, so no geometry was judged - a skip, not a pass", v.Tool) + } else if v.Err != nil { + t.Fatalf("%v at %d B: %v", props, size, v.Err) + } + if s := oracle.Strict("geojson", path, geojsonSettings(props)...); s.Err != nil { + t.Fatalf("%v at %d B: %v", props, size, s.Err) + } else if !s.Available { + t.Skip("the structural check needs python") + } + } + } +} + +// The smallest closing feature is carried forward from three and four points +// rather than measured at a million, so planning a file of a million points +// does not draw seven features of a million points first. Carrying it forward +// is only right while every position of a kind costs the same at its widest - +// and the largest kind at three points is not the largest at a thousand, so +// the two have to agree kind by kind. This measures the whole feature and +// compares. +func TestTheSmallestGeoJSONFeatureCarriedForwardIsTheOneMeasuredWhole(t *testing.T) { + checked := 0 + for _, geometry := range []string{geojson.Mixed, geojson.Point, geojson.LineString, geojson.Polygon, + geojson.MultiPoint, geojson.MultiLineString, geojson.MultiPolygon, geojson.GeometryCollection} { + for _, layout := range []string{geojson.RecordPerLine, geojson.Minified, geojson.Indented} { + for _, extra := range []string{"3", "4", "5", "6", "9", "100", "5000"} { + props := map[string]string{geojson.Geometry: geometry, geojson.Formatting: layout, + geojson.Vertices: extra, geojson.Altitude: strconv.FormatBool(checked%2 == 0), + geojson.Precision: strconv.Itoa(checked % 16)} + carried, whole, err := geojson.ClosingFeatureBounds(props) + if err != nil { + t.Fatalf("%v: %v", props, err) + } + if carried != whole { + t.Errorf("%v: the smallest closing feature carried forward is %d B and measured whole it is %d B", + props, carried, whole) + } + checked++ + } + } + } + t.Logf("%d combinations, each carried forward and measured whole", checked) +} + +// GDAL refuses a string of ten million characters (measured 2026-10-07), and a +// feature of a hundred thousand points leaves more than a mebibyte for the note +// of a file one feature long. Above a mebibyte the remainder is spaces after +// the feature. The checker reports how many, and the file has to have reached +// that state - a guard of the cap that never makes a file past it would be +// green for a reason that has nothing to do with the cap. +func TestAGeoJSONNotePastAMebibyteBecomesSpacesAndSurvivesItsReferenceTool(t *testing.T) { + d, err := format.Get("geojson") + if err != nil { + t.Fatal(err) + } + props := map[string]string{geojson.Geometry: geojson.Polygon, geojson.Vertices: "100000"} + size := d.SmallestAccepted(format.Request{Properties: props}) + 5<<20/4 + path := filepath.Join(t.TempDir(), "capped.geojson") + if n := writeGeoJSON(t, path, size, 5, props); n != 1 { + t.Fatalf("the file holds %d features and this guard needs one, so its note owes the whole remainder", n) + } + s := oracle.Strict("geojson", path, geojsonSettings(props)...) + if !s.Available { + t.Skip("the structural check needs python") + } + if s.Err != nil { + t.Fatal(s.Err) + } + m := regexp.MustCompile(`(\d+) trailing spaces`).FindStringSubmatch(s.Output) + if m == nil || m[1] == "0" { + t.Fatalf("the checker reports %q - no spaces after the feature, so the note was never capped", s.Output) + } + if res := mustOracle(t, d).Check(path); res.Available && res.Err != nil { + t.Fatalf("GDAL refused the capped file: %v", res.Err) + } +} + +// A line needs a step of longitude for every point. At a whole degree the +// globe has 360 of them, less one at each side, so a line takes 359 points +// and an outline, which goes out along the bottom and back along the top, 716. +// Points use no vertices and are never refused for them. +func TestGeoJSONRefusesMorePointsThanTheGlobeHasRoomFor(t *testing.T) { + d, err := format.Get("geojson") + if err != nil { + t.Fatal(err) + } + for _, c := range []struct { + geometry string + most int + }{{geojson.LineString, 359}, {geojson.Mixed, 359}, {geojson.Polygon, 716}, {geojson.MultiPolygon, 716}} { + for _, n := range []int{c.most, c.most + 1} { + props := map[string]string{geojson.Geometry: c.geometry, geojson.Precision: "0", geojson.Vertices: strconv.Itoa(n)} + _, err := d.Generator.Plan(format.Request{Bytes: 1 << 30, Properties: props}) + var refused *format.PropertyValueError + switch { + case n == c.most && err != nil: + t.Errorf("%s with %d points at precision 0 was refused, and it fits: %v", c.geometry, n, err) + case n > c.most && !(errors.As(err, &refused) && refused.Key == geojson.Vertices): + t.Errorf("%s with %d points at precision 0 was not refused for its points: %v", c.geometry, n, err) + } + } + } + points := map[string]string{geojson.Geometry: geojson.Point, geojson.Precision: "0", geojson.Vertices: "1000000"} + if _, err := d.Generator.Plan(format.Request{Bytes: 1 << 20, Properties: points}); err != nil { + t.Errorf("points use no vertices, and a million of them at precision 0 was refused: %v", err) + } +} + +func mustOracle(t *testing.T, d format.Descriptor) oracle.Checker { + t.Helper() + c, ok := oracle.For(d.Oracle) + if !ok { + t.Fatalf("%s declares the oracle %q and nothing implements it", d.ID, d.Oracle) + } + return c +} + +// writeGeoJSON writes one file and says how many features it holds, read back +// with the standard library rather than counted by the generator. +func writeGeoJSON(t *testing.T, path string, size int64, seed uint64, props map[string]string) int { + t.Helper() + d, err := format.Get("geojson") + if err != nil { + t.Fatal(err) + } + p, err := d.Generator.Plan(format.Request{Bytes: size, Seed: seed, Label: true, Properties: props}) + if err != nil { + t.Fatalf("planning %d B with %v: %v", size, props, err) + } + var buf bytes.Buffer + if err := d.Generator.Write(context.Background(), &buf, p); err != nil { + t.Fatalf("writing %d B with %v: %v", size, props, err) + } + if int64(buf.Len()) != size { + t.Fatalf("%v: asked for %d B and got %d", props, size, buf.Len()) + } + if err := os.WriteFile(path, buf.Bytes(), 0o600); err != nil { + t.Fatal(err) + } + var doc struct { + Features []json.RawMessage `json:"features"` + } + if err := json.Unmarshal(buf.Bytes(), &doc); err != nil { + t.Fatalf("%v at %d B is not JSON: %v", props, size, err) + } + return len(doc.Features) +} + +// geojsonSettings is a case as the words the structural checker is told. +func geojsonSettings(props map[string]string) []string { + var out []string + for k, v := range props { + out = append(out, k+"="+v) + } + sort.Strings(out) + return out +} diff --git a/internal/guard/layers_test.go b/internal/guard/layers_test.go index 2115cf79..52269b0a 100644 --- a/internal/guard/layers_test.go +++ b/internal/guard/layers_test.go @@ -48,6 +48,7 @@ var layer = map[string]int{ "internal/format/logfile": 1, "internal/format/csvfile": 1, "internal/format/jsonfile": 1, + "internal/format/geojson": 1, "internal/format/yamlfile": 1, "internal/format/tomlfile": 1, "internal/format/xmlfile": 1, @@ -130,6 +131,7 @@ var sameLayerAllowed = map[string][]string{ "internal/format/logfile", "internal/format/csvfile", "internal/format/jsonfile", + "internal/format/geojson", "internal/format/yamlfile", "internal/format/tomlfile", "internal/format/xmlfile", @@ -163,6 +165,7 @@ var sameLayerAllowed = map[string][]string{ "internal/format/logfile": {"internal/format"}, "internal/format/csvfile": {"internal/format"}, "internal/format/jsonfile": {"internal/format"}, + "internal/format/geojson": {"internal/format"}, "internal/format/yamlfile": {"internal/format"}, "internal/format/tomlfile": {"internal/format", "internal/format/textenc"}, "internal/format/xmlfile": {"internal/format", "internal/format/textenc"}, diff --git a/internal/guard/oracle_test.go b/internal/guard/oracle_test.go index 2f34a224..01b7d3fa 100644 --- a/internal/guard/oracle_test.go +++ b/internal/guard/oracle_test.go @@ -176,6 +176,11 @@ var structurallyChecked = map[string]bool{ // samples plays as far as a decoder gets, and only the tables read against // the media data say so (docs/MP4-2026-10-07.md section 5). "mp4": true, + // Since 2026-10-07, and from its first day: GDAL took a feature with no + // geometry member and a latitude of 120 without a word, and only this + // layer knows how many decimal places and which winding were ordered + // (docs/GEOJSON-2026-10-07.md section 3). + "geojson": true, } func TestTheStructuralCheckerCoversEveryFormatItShould(t *testing.T) { diff --git a/internal/guard/parity_test.go b/internal/guard/parity_test.go index 18c5a7f8..6036d49f 100644 --- a/internal/guard/parity_test.go +++ b/internal/guard/parity_test.go @@ -127,6 +127,7 @@ var reachableFromTheWindow = []string{ "format:jpg", "format:pptx", "format:json", + "format:geojson", "format:log", "format:avif", "format:jxl", @@ -164,6 +165,13 @@ var reachableFromTheWindow = []string{ "property:xlsx.columns", "property:xlsx.rows", "property:bmp.width", + "property:geojson.altitude", + "property:geojson.antimeridian", + "property:geojson.formatting", + "property:geojson.geometry", + "property:geojson.precision", + "property:geojson.vertices", + "property:geojson.winding", "property:gif.frames", "property:gif.height", "property:gif.width", diff --git a/internal/guard/presetbytes_test.go b/internal/guard/presetbytes_test.go index 038eeaa4..a1b16eea 100644 --- a/internal/guard/presetbytes_test.go +++ b/internal/guard/presetbytes_test.go @@ -91,7 +91,10 @@ func TestEjectingAPresetGivesTheBytesItAlwaysGave(t *testing.T) { // (docs/MP4-2026-10-07.md section 10): MP4 is a format more, so the // set has its smallest film, 3312 B. A Changed entry and no major - // no file any release made changes. - {id: "empty-and-minimal", args: preset.Args{}, bytes: 9574, sum: "3fd628031191f01a2559da100384dcfbecd31bb4ab6629156c0a3ac74f190921"}, + // Moved a fifth time on 2026-10-07, under the same decision: geojson is + // a format more, so the set has its smallest collection, 875 B + // (docs/GEOJSON-2026-10-07.md). + {id: "empty-and-minimal", args: preset.Args{}, bytes: 9885, sum: "2a02ad1ec2e2c2ff7f19b87906ecf3ca910e1af5e806b135467824c28fb4fc24"}, {id: "empty-and-minimal", args: preset.Args{"formats": "jpg,png,txt"}, bytes: 1472, sum: "19b12800372395ad3bf5cba6407ca654d7ed51eba3a5bc5436f76a94bc09253c"}, // The preset of unusual file names, measured 2026-09-25 on its first // build: the default, and a format whose extension is a byte longer, diff --git a/internal/guard/testdata/generator-golden.json b/internal/guard/testdata/generator-golden.json index f83b5b70..76302645 100644 --- a/internal/guard/testdata/generator-golden.json +++ b/internal/guard/testdata/generator-golden.json @@ -381,6 +381,36 @@ "bytes": 524288, "sha256": "ae5d267ff067caf04aa42e72916f67a89a19584d2ea30445a955202571fc45c3", "measured_on": "2026-10-07" + }, + "geojson_8kib": { + "bytes": 8192, + "sha256": "bc35db22ca96b83a89998c5f537ae494788a7bd009a3f614f359a6d881366f8a", + "measured_on": "2026-10-07" + }, + "geojson_8kib_minified": { + "bytes": 8192, + "sha256": "fdb40fcd26d1df1b86b28f173256588930c26a390f3e2be1862f80ba6fedf298", + "measured_on": "2026-10-07" + }, + "geojson_8kib_indented": { + "bytes": 8192, + "sha256": "ec3b1d46fc2bfa1bf62a8f68823e36cd78269565d87275d442eaf059a4ce1ce5", + "measured_on": "2026-10-07" + }, + "geojson_8kib_whole_degrees": { + "bytes": 8192, + "sha256": "a51236f01f575b8e8b72d4334cb2a2b9716bb5c24be7f443792dc6751cf7f556", + "measured_on": "2026-10-07" + }, + "geojson_8kib_every_pitfall": { + "bytes": 8192, + "sha256": "541fc72eebe970e742b2f2317c03e6dcb22cd9a4fffa19f7f14ec410cf85627a", + "measured_on": "2026-10-07" + }, + "geojson_capped_note": { + "bytes": 3900000, + "sha256": "b921833657d0f75935cbd0c571199cb03cd9be8d57ed77f841c4282f87928162", + "measured_on": "2026-10-07" } }, "remeasured": [ diff --git a/internal/guard/testdata/screens/catalogue.png b/internal/guard/testdata/screens/catalogue.png index e1359cc8..0a327cd0 100644 Binary files a/internal/guard/testdata/screens/catalogue.png and b/internal/guard/testdata/screens/catalogue.png differ diff --git a/internal/guard/testdata/screens/catalogue.xml b/internal/guard/testdata/screens/catalogue.xml index d1bc206b..83a00b81 100644 --- a/internal/guard/testdata/screens/catalogue.xml +++ b/internal/guard/testdata/screens/catalogue.xml @@ -614,20 +614,20 @@ - - - - + + + + - + zip - + - + @@ -1329,229 +1329,235 @@ - - - - - + + + + + - - - - - - - Archives · 2 + + + + + + + Archives · 2 - - + + - targz - tar + gzip + targz + tar + gzip - - + + - zip - ZIP + zip + ZIP - - - Documents · 4 + + + Documents · 4 - - + + - docx - Word (Office Open XML) + docx + Word (Office Open XML) - - + + - pdf - Portable Document Format + pdf + Portable Document Format - - + + - pptx - PowerPoint (Office Open XML) + pptx + PowerPoint (Office Open XML) - - + + - xlsx - Excel (Office Open XML) + xlsx + Excel (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + - bmp - Windows Bitmap + bmp + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + - jpg - JPEG + jpg + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - - + + + - png - Portable Network Graphics + png + Portable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + - webp - WebP + webp + WebP - - - Sound · 1 + + + Sound · 1 - - + + - wav - Waveform Audio + wav + Waveform Audio - - - Text and data · 9 + + + Text and data · 10 - - + + - csv - Comma-Separated Values + csv + Comma-Separated Values - - + + - html - HyperText Markup Language + geojson + GeoJSON - - + + - json - JavaScript Object Notation + html + HyperText Markup Language - - + + - log - Server and application log + json + JavaScript Object Notation - - + + - md - Markdown + log + Server and application log - - + + - toml - TOML + md + Markdown - - + + - txt - Plain text + toml + TOML - - + + - xml - Extensible Markup Language + txt + Plain text - - + + - yaml - YAML + xml + Extensible Markup Language - - - Video · 2 + + + + yaml + YAML + + + + Video · 2 - - + + - mp4 - MP4 video + mp4 + MP4 video - - + + - webm - WebM video + webm + WebM video - - + + - - - + + + - - - - - - - + + + + + + + type to filter - + @@ -1573,168 +1579,168 @@ - - - - - + + + + + - - - - - - - Archives · 1 + + + + + + + Archives · 1 - - + + zi p - - ZIP + + ZIP - - - Documents · 2 + + + Documents · 2 - - + + p - df - - P - ortable Document Format + df + + P + ortable Document Format - - + + p - ptx - - P - owerPoint (Office Open XML) + ptx + + P + owerPoint (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + bm p - - Windows Bitmap + + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + j p - g - JPEG + g + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - - + + + p - ng - - P - ortable Network Graphics + ng + + P + ortable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + web p - - WebP + + WebP - - - Text and data · 1 + + + Text and data · 1 - - + + - txt - - P - lain text + txt + + P + lain text - - - Video · 1 + + + Video · 1 - - + + m p - 4 - MP4 video + 4 + MP4 video - - + + - + - - - - - - - + + + + + + + p @@ -1756,29 +1762,29 @@ - - - - - + + + + + - - - - - - - No format matches - clear the box to see all + + + + + + + No format matches - clear the box to see all - - - - - - - + + + + + + + zz diff --git a/internal/guard/testdata/screens/generate-menu-hovered.png b/internal/guard/testdata/screens/generate-menu-hovered.png index 379eb023..dd90b007 100644 Binary files a/internal/guard/testdata/screens/generate-menu-hovered.png and b/internal/guard/testdata/screens/generate-menu-hovered.png differ diff --git a/internal/guard/testdata/screens/generate-menu-hovered.xml b/internal/guard/testdata/screens/generate-menu-hovered.xml index a67e613e..6e025a4e 100644 --- a/internal/guard/testdata/screens/generate-menu-hovered.xml +++ b/internal/guard/testdata/screens/generate-menu-hovered.xml @@ -496,230 +496,236 @@ - - - - - - + + + + + + - - - - - - - Archives · 2 - - - + + + + + + + Archives · 2 + + + - targz - tar + gzip + targz + tar + gzip - - + + - zip - ZIP + zip + ZIP - - - Documents · 4 + + + Documents · 4 - - + + - docx - Word (Office Open XML) + docx + Word (Office Open XML) - - + + - pdf - Portable Document Format + pdf + Portable Document Format - - + + - pptx - PowerPoint (Office Open XML) + pptx + PowerPoint (Office Open XML) - - + + - xlsx - Excel (Office Open XML) + xlsx + Excel (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - - + + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + - bmp - Windows Bitmap + bmp + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + - jpg - JPEG + jpg + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - + + - png - Portable Network Graphics + png + Portable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + - webp - WebP + webp + WebP - - - Sound · 1 + + + Sound · 1 - - + + - wav - Waveform Audio + wav + Waveform Audio - - - Text and data · 9 + + + Text and data · 10 - - + + - csv - Comma-Separated Values + csv + Comma-Separated Values - - + + - html - HyperText Markup Language + geojson + GeoJSON - - + + - json - JavaScript Object Notation + html + HyperText Markup Language - - + + - log - Server and application log + json + JavaScript Object Notation - - + + - md - Markdown + log + Server and application log - - + + - toml - TOML + md + Markdown - - + + - txt - Plain text + toml + TOML - - + + - xml - Extensible Markup Language + txt + Plain text - - + + - yaml - YAML + xml + Extensible Markup Language - - - Video · 2 + + + + yaml + YAML + + + + Video · 2 - - + + - mp4 - MP4 video + mp4 + MP4 video - - + + - webm - WebM video + webm + WebM video - - + + - - - + + + - - - - - - - + + + + + + + type to filter - + diff --git a/internal/guard/testdata/screens/generate-menu-keyed.png b/internal/guard/testdata/screens/generate-menu-keyed.png index 86562327..ff4e980b 100644 Binary files a/internal/guard/testdata/screens/generate-menu-keyed.png and b/internal/guard/testdata/screens/generate-menu-keyed.png differ diff --git a/internal/guard/testdata/screens/generate-menu-keyed.xml b/internal/guard/testdata/screens/generate-menu-keyed.xml index ef544a38..1972aa90 100644 --- a/internal/guard/testdata/screens/generate-menu-keyed.xml +++ b/internal/guard/testdata/screens/generate-menu-keyed.xml @@ -496,230 +496,236 @@ - - - - - - + + + + + + - - - - - - - Archives · 2 - - - + + + + + + + Archives · 2 + + + - targz - tar + gzip + targz + tar + gzip - - + + - zip - ZIP + zip + ZIP - - - Documents · 4 + + + Documents · 4 - - + + - docx - Word (Office Open XML) + docx + Word (Office Open XML) - - + + - pdf - Portable Document Format + pdf + Portable Document Format - - + + - pptx - PowerPoint (Office Open XML) + pptx + PowerPoint (Office Open XML) - - + + - xlsx - Excel (Office Open XML) + xlsx + Excel (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - - + + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + - bmp - Windows Bitmap + bmp + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + - jpg - JPEG + jpg + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - + + - png - Portable Network Graphics + png + Portable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + - webp - WebP + webp + WebP - - - Sound · 1 + + + Sound · 1 - - + + - wav - Waveform Audio + wav + Waveform Audio - - - Text and data · 9 + + + Text and data · 10 - - + + - csv - Comma-Separated Values + csv + Comma-Separated Values - - + + - html - HyperText Markup Language + geojson + GeoJSON - - + + - json - JavaScript Object Notation + html + HyperText Markup Language - - + + - log - Server and application log + json + JavaScript Object Notation - - + + - md - Markdown + log + Server and application log - - + + - toml - TOML + md + Markdown - - + + - txt - Plain text + toml + TOML - - + + - xml - Extensible Markup Language + txt + Plain text - - + + - yaml - YAML + xml + Extensible Markup Language - - - Video · 2 + + + + yaml + YAML + + + + Video · 2 - - + + - mp4 - MP4 video + mp4 + MP4 video - - + + - webm - WebM video + webm + WebM video - - + + - - - + + + - - - - - - - + + + + + + + type to filter - + diff --git a/internal/guard/testdata/screens/generate-menu.png b/internal/guard/testdata/screens/generate-menu.png index a1e69e8e..596122d8 100644 Binary files a/internal/guard/testdata/screens/generate-menu.png and b/internal/guard/testdata/screens/generate-menu.png differ diff --git a/internal/guard/testdata/screens/generate-menu.xml b/internal/guard/testdata/screens/generate-menu.xml index 73446f3c..b19ad7b8 100644 --- a/internal/guard/testdata/screens/generate-menu.xml +++ b/internal/guard/testdata/screens/generate-menu.xml @@ -496,230 +496,236 @@ - - - - - - + + + + + + - - - - - - - Archives · 2 - - - + + + + + + + Archives · 2 + + + - targz - tar + gzip + targz + tar + gzip - - + + - zip - ZIP + zip + ZIP - - - Documents · 4 + + + Documents · 4 - - + + - docx - Word (Office Open XML) + docx + Word (Office Open XML) - - + + - pdf - Portable Document Format + pdf + Portable Document Format - - + + - pptx - PowerPoint (Office Open XML) + pptx + PowerPoint (Office Open XML) - - + + - xlsx - Excel (Office Open XML) + xlsx + Excel (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - - + + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + - bmp - Windows Bitmap + bmp + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + - jpg - JPEG + jpg + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - + + - png - Portable Network Graphics + png + Portable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + - webp - WebP + webp + WebP - - - Sound · 1 + + + Sound · 1 - - + + - wav - Waveform Audio + wav + Waveform Audio - - - Text and data · 9 + + + Text and data · 10 - - + + - csv - Comma-Separated Values + csv + Comma-Separated Values - - + + - html - HyperText Markup Language + geojson + GeoJSON - - + + - json - JavaScript Object Notation + html + HyperText Markup Language - - + + - log - Server and application log + json + JavaScript Object Notation - - + + - md - Markdown + log + Server and application log - - + + - toml - TOML + md + Markdown - - + + - txt - Plain text + toml + TOML - - + + - xml - Extensible Markup Language + txt + Plain text - - + + - yaml - YAML + xml + Extensible Markup Language - - - Video · 2 + + + + yaml + YAML + + + + Video · 2 - - + + - mp4 - MP4 video + mp4 + MP4 video - - + + - webm - WebM video + webm + WebM video - - + + - - - + + + - - - - - - - + + + + + + + type to filter - + diff --git a/internal/guard/testdata/screens/preset-menu-setting.png b/internal/guard/testdata/screens/preset-menu-setting.png index 1fd0b090..b7fe4523 100644 Binary files a/internal/guard/testdata/screens/preset-menu-setting.png and b/internal/guard/testdata/screens/preset-menu-setting.png differ diff --git a/internal/guard/testdata/screens/preset-menu-setting.xml b/internal/guard/testdata/screens/preset-menu-setting.xml index 9009391c..8309fc0b 100644 --- a/internal/guard/testdata/screens/preset-menu-setting.xml +++ b/internal/guard/testdata/screens/preset-menu-setting.xml @@ -459,230 +459,236 @@ - - - - - - + + + + + + - - - - - - - Archives · 2 - - - + + + + + + + Archives · 2 + + + - targz - tar + gzip + targz + tar + gzip - - + + - zip - ZIP + zip + ZIP - - - Documents · 4 + + + Documents · 4 - - + + - docx - Word (Office Open XML) + docx + Word (Office Open XML) - - - + + + - pdf - Portable Document Format + pdf + Portable Document Format - - + + - pptx - PowerPoint (Office Open XML) + pptx + PowerPoint (Office Open XML) - - + + - xlsx - Excel (Office Open XML) + xlsx + Excel (Office Open XML) - - - Pictures · 10 + + + Pictures · 10 - - + + - avif - AV1 Image File Format + avif + AV1 Image File Format - - + + - bmp - Windows Bitmap + bmp + Windows Bitmap - - + + - gif - Graphics Interchange Format + gif + Graphics Interchange Format - - + + - ico - Windows Icon + ico + Windows Icon - - + + - jpg - JPEG + jpg + JPEG - - + + - jxl - JPEG XL + jxl + JPEG XL - - + + - png - Portable Network Graphics + png + Portable Network Graphics - - + + - svg - Scalable Vector Graphics + svg + Scalable Vector Graphics - - + + - tiff - Tagged Image File Format + tiff + Tagged Image File Format - - + + - webp - WebP + webp + WebP - - - Sound · 1 + + + Sound · 1 - - + + - wav - Waveform Audio + wav + Waveform Audio - - - Text and data · 9 + + + Text and data · 10 - - + + - csv - Comma-Separated Values + csv + Comma-Separated Values - - + + - html - HyperText Markup Language + geojson + GeoJSON - - + + - json - JavaScript Object Notation + html + HyperText Markup Language - - + + - log - Server and application log + json + JavaScript Object Notation - - + + - md - Markdown + log + Server and application log - - + + - toml - TOML + md + Markdown - - + + - txt - Plain text + toml + TOML - - + + - xml - Extensible Markup Language + txt + Plain text - - + + - yaml - YAML + xml + Extensible Markup Language - - - Video · 2 + + + + yaml + YAML + + + + Video · 2 - - + + - mp4 - MP4 video + mp4 + MP4 video - - + + - webm - WebM video + webm + WebM video - - + + - - - + + + - - - - - - - + + + + + + + type to filter - + diff --git a/internal/guard/testdata/screens/preset-menu.png b/internal/guard/testdata/screens/preset-menu.png index ce2a3050..857b6991 100644 Binary files a/internal/guard/testdata/screens/preset-menu.png and b/internal/guard/testdata/screens/preset-menu.png differ diff --git a/internal/guard/testdata/screens/preset-menu.xml b/internal/guard/testdata/screens/preset-menu.xml index 647ab8df..0f56f950 100644 --- a/internal/guard/testdata/screens/preset-menu.xml +++ b/internal/guard/testdata/screens/preset-menu.xml @@ -370,7 +370,7 @@ - 30 files · 38.3 KB (39 263 B) · 28 formats · will go to /tfg/out + 31 files · 39.2 KB (40 138 B) · 29 formats · will go to /tfg/out diff --git a/internal/guard/testdata/screens/preset.png b/internal/guard/testdata/screens/preset.png index fbf03d8b..e8650466 100644 Binary files a/internal/guard/testdata/screens/preset.png and b/internal/guard/testdata/screens/preset.png differ diff --git a/internal/guard/testdata/screens/preset.xml b/internal/guard/testdata/screens/preset.xml index f8c7b66a..58a3cd48 100644 --- a/internal/guard/testdata/screens/preset.xml +++ b/internal/guard/testdata/screens/preset.xml @@ -370,7 +370,7 @@ - 30 files · 38.3 KB (39 263 B) · 28 formats · will go to /tfg/out + 31 files · 39.2 KB (40 138 B) · 29 formats · will go to /tfg/out diff --git a/internal/guard/testdata/screens/recipe-on-a-preset.png b/internal/guard/testdata/screens/recipe-on-a-preset.png index 0f4071cb..52ec110d 100644 Binary files a/internal/guard/testdata/screens/recipe-on-a-preset.png and b/internal/guard/testdata/screens/recipe-on-a-preset.png differ diff --git a/internal/guard/testdata/screens/recipe-on-a-preset.xml b/internal/guard/testdata/screens/recipe-on-a-preset.xml index c82f7581..a3020fdf 100644 --- a/internal/guard/testdata/screens/recipe-on-a-preset.xml +++ b/internal/guard/testdata/screens/recipe-on-a-preset.xml @@ -658,7 +658,7 @@ - 31 files · 10.0 MB (10 525 023 B) · 28 formats · will go to /tfg/out + 32 files · 10.0 MB (10 525 898 B) · 29 formats · will go to /tfg/out diff --git a/internal/guard/textformats_test.go b/internal/guard/textformats_test.go index f3759ace..521b912b 100644 --- a/internal/guard/textformats_test.go +++ b/internal/guard/textformats_test.go @@ -444,7 +444,7 @@ func TestAnSVGDrawingCarriesRealShapes(t *testing.T) { // This is the shape docs/OBSERVATIONS.md now calls out: an audit of // completeness has to run FROM THE SOURCE towards the list. Walking the entries // already written down cannot, by construction, find what is missing from them. -var textFormats = []string{"txt", "md", "log", "csv", "json", "xml", "html", "svg", "yaml", "toml"} +var textFormats = []string{"txt", "md", "log", "csv", "json", "xml", "html", "svg", "yaml", "toml", "geojson"} var binaryFormats = []string{"avif", "bmp", "docx", "gif", "ico", "jpg", "jxl", "mp4", "pdf", "png", "pptx", "targz", "tiff", "wav", "webm", "webp", "xlsx", "zip"} @@ -679,16 +679,22 @@ func TestRecordNumbersRunFromOneWithoutAGap(t *testing.T) { cases := []struct { format string number *regexp.Regexp + // smallest is the first size asked for, the smallest where two records + // fit. A kilobyte for every format but GeoJSON, whose smallest file is + // 875 B - the largest feature its default settings can draw - so a + // kilobyte holds one feature and shows no numbering at all. + smallest int64 }{ - {"csv", regexp.MustCompile(`(?m)^(\d+),`)}, - {"json", regexp.MustCompile(`\{"id":(\d+),`)}, - {"xml", regexp.MustCompile(` 180: + q[0] -= 360 + while q[0] - out[-1][0] < -180: + q[0] += 360 + out.append(q) + return out + return [unwrapped(x) for x in c] + +def geometry(g): + if g["type"] == "GeometryCollection": + return {"type": g["type"], "geometries": [geometry(m) for m in g["geometries"]]} + return {"type": g["type"], "coordinates": unwrapped(g["coordinates"]) if unwrap else g["coordinates"]} + +with open(path, encoding="utf-8") as f: + doc = json.load(f) +for feature in doc["features"]: + shaped = shape(geometry(feature["geometry"])) + if not shaped.is_valid: + print("FAIL feature %s %s: %s" % (feature["id"], feature["geometry"]["type"], explain_validity(shaped))) + sys.exit(1) +print("OK %d features, every geometry valid" % len(doc["features"])) +` diff --git a/internal/oracle/oracle.go b/internal/oracle/oracle.go index 4e53300b..bb7148d7 100644 --- a/internal/oracle/oracle.go +++ b/internal/oracle/oracle.go @@ -348,6 +348,9 @@ var checkers = map[string]Checker{ return nil }, }, + + // GDAL's GeoJSON driver. See geoscripts.go. + "gdal-geojson": gdalGeoJSON, } // DecodedFrames is how many frames the libaom oracle decoded, read from what @@ -535,6 +538,9 @@ func Strict(formatID, path string, settings ...string) Result { func StrictKnows(formatID string) bool { switch formatID { case "png", "wav", "pdf", "zip", "targz", "log", "csv", "json", "xml", "svg", "html", + // From its first day, because GDAL alone took files this one refuses + // (docs/GEOJSON-2026-10-07.md section 3). + "geojson", "bmp", "gif", "ico", "jpg", "tiff", "webp", "avif", "jxl", "docx", "xlsx", "pptx", // The two text formats joined on 2026-09-07, when they gained an // encoding. Before that there was nothing here to check against diff --git a/internal/oracle/strict.py b/internal/oracle/strict.py index 3a358a8a..dcffb932 100644 --- a/internal/oracle/strict.py +++ b/internal/oracle/strict.py @@ -2154,6 +2154,229 @@ def check_mp4(data): ok(f"{len(lengths)} frames, {len(keys)} key frames, every one a sync sample, the tables agree with the media data") +class GeoNumber(str): + """A number exactly as the file wrote it, so its decimal places can be counted.""" + + +GEOJSON_KINDS = ["Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", + "MultiPolygon", "GeometryCollection"] +GEOJSON_FEATURE_KEYS = ["type", "id", "geometry", "properties"] +GEOJSON_PROPERTY_KEYS = ["name", "amount", "active", "retired", "tags", "address", "note"] +# The longest the closing note gets before spaces take the rest, measured +# against GDAL on 2026-10-07 (docs/GEOJSON-2026-10-07.md section 5). +GEOJSON_NOTE_CAP = 1 << 20 + + +def geo_dump(value, indent, depth=0): + """The text a layout makes of a value - JSON.stringify(x, null, 2) indented, + no whitespace at all otherwise - with numbers as the file wrote them.""" + if isinstance(value, GeoNumber): + return str(value) + if value is True or value is False: + return "true" if value else "false" + if value is None: + return "null" + if isinstance(value, str): + import json + return json.dumps(value) + if isinstance(value, dict): + items = [f'"{k}":' + (" " if indent else "") + geo_dump(v, indent, depth + 1) for k, v in value.items()] + open_, close = "{", "}" + else: + items = [geo_dump(v, indent, depth + 1) for v in value] + open_, close = "[", "]" + if not indent: + return open_ + ",".join(items) + close + pad = "\n" + " " * (depth + 1) + return open_ + pad + ("," + pad).join(items) + "\n" + " " * depth + close + + +def geo_layout(text, doc, layout): + """The file against the text its layout makes of its own content. + + Returns how many spaces stand after the last feature - the one place a + byte may be other than the rule says, and only once the note is full. + """ + feats = doc["features"] + if layout == "indented": + expected, last = geo_dump(doc, True) + "\n", geo_dump(feats[-1], True, 2) + elif layout == "minified": + expected, last = geo_dump(doc, False), geo_dump(feats[-1], False) + elif layout == "record-per-line": + expected = ('{"type":"FeatureCollection","features":[\n' + + ",\n".join(geo_dump(f, False) for f in feats) + "\n]}\n") + last = geo_dump(feats[-1], False) + else: + fail(f"the geojson check was told formatting={layout!r}, which is not a layout this tool writes") + if text == expected: + return 0 + cut = expected.rindex(last) + len(last) + spaces = len(text) - len(expected) + if (spaces <= 0 or not text.startswith(expected[:cut]) or not text.endswith(expected[cut:]) + or text[cut:cut + spaces].strip(" ")): + at = next(i for i, (a, b) in enumerate(zip(text, expected)) if a != b) if text[:cut] != expected[:cut] else cut + fail(f"the file is not laid out {layout}: it parts from the rule at byte {at}, " + f"{text[max(0, at - 30):at + 30]!r}") + return spaces + + +def geo_pieces(geom): + """(what the piece is, its coordinates) for every part of a geometry.""" + kind = geom["type"] + if kind == "GeometryCollection": + members = geom["geometries"] + if [m["type"] for m in members] != ["Point", "LineString", "Polygon"]: + fail(f"a collection holds {[m['type'] for m in members]}, not a point, a line and a polygon") + return [(m["type"], m["coordinates"]) for m in members] + single = {"MultiPoint": "LineString", "MultiLineString": "LineString", "MultiPolygon": "Polygon"} + if kind in ("MultiLineString", "MultiPolygon"): + if len(geom["coordinates"]) != 2: + fail(f"a {kind} has {len(geom['coordinates'])} parts, not two") + return [(single[kind], c) for c in geom["coordinates"]] + return [(single.get(kind, kind), geom["coordinates"])] + + +def geo_position(pos, places, dims): + if len(pos) != dims: + fail(f"a position has {len(pos)} numbers and {dims} were ordered") + for i, n in enumerate(pos): + if not isinstance(n, GeoNumber): + fail(f"a position holds {n!r}, which is not a number") + whole, dot, frac = n.lstrip("-").partition(".") + if (dot != "") != (places > 0) or len(frac) != places: + fail(f"{n} is not written with {places} decimal places") + if n.startswith("-") and not (whole + frac).strip("0"): + fail(f"{n} is a negative zero") + lon, lat = float(pos[0]), float(pos[1]) + if not (-180 <= lon <= 180 and -85 <= lat <= 85): + fail(f"the position {list(map(str, pos))} is outside longitude -180..180 or latitude -85..85") + if dims == 3 and not -400 <= float(pos[2]) <= 8848: + fail(f"the height {pos[2]} is outside -400..8848 metres") + + +def geo_crosses(run): + return any(abs(float(a[0]) - float(b[0])) > 180 for a, b in zip(run, run[1:])) + + +def geo_ring(ring, settings): + """An outline: closed, as many points as ordered, wound the ordered way.""" + if ring[0] != ring[-1]: + fail("an outline does not end where it starts") + xs = [float(p[0]) for p in ring] + if settings["antimeridian"]: + for i in range(1, len(xs)): + while xs[i] - xs[i - 1] > 180: + xs[i] -= 360 + while xs[i] - xs[i - 1] < -180: + xs[i] += 360 + ys = [float(p[1]) for p in ring] + area = sum(xs[i] * ys[i + 1] - xs[i + 1] * ys[i] for i in range(len(ring) - 1)) / 2 + if (area > 0) != (settings["winding"] == "rfc7946"): + fail(f"an outline runs {'counter-clockwise' if area > 0 else 'clockwise'} " + f"and winding={settings['winding']} was ordered") + + +def geo_feature(number, feat, settings, kinds): + if not isinstance(feat, dict): + fail(f"feature {number} is {type(feat).__name__} rather than an object") + if list(feat) != GEOJSON_FEATURE_KEYS or feat["type"] != "Feature": + fail(f"feature {number} has the members {list(feat)}, not {GEOJSON_FEATURE_KEYS}") + # Both may be null in RFC 7946, and this tool writes neither null - a + # feature without a place or without properties is a file it did not make. + if not isinstance(feat["geometry"], dict) or not isinstance(feat["properties"], dict): + fail(f"feature {number} has a geometry of {type(feat['geometry']).__name__} and properties of " + f"{type(feat['properties']).__name__} - this tool writes an object for both") + if feat["id"] != str(number): + fail(f"feature {number} carries the id {feat['id']}, so the ids do not run 1..N") + want = kinds[(number - 1) % len(kinds)] + if feat["geometry"]["type"] != want: + fail(f"feature {number} is a {feat['geometry']['type']} and geometry={settings['geometry']} makes it a {want}") + props = feat["properties"] + if list(props) != GEOJSON_PROPERTY_KEYS: + fail(f"feature {number} has the properties {list(props)}, not {GEOJSON_PROPERTY_KEYS}") + # Every value type JSON has, one each - the format document's promise, not + # whatever the generator happens to write. + types = [type(props[k]) for k in GEOJSON_PROPERTY_KEYS] + if types != [str, GeoNumber, bool, type(None), list, dict, str]: + fail(f"feature {number} has properties of the types {[t.__name__ for t in types]}") + dims, n = (3 if settings["altitude"] else 2), settings["vertices"] + for piece, coords in geo_pieces(feat["geometry"]): + runs = {"Point": [[coords]], "LineString": [coords], "Polygon": coords}[piece] + # One outline and no holes - with none at all the loop below would have + # nothing to check and a polygon of no rings would pass. + if piece == "Polygon" and len(runs) != 1: + fail(f"feature {number}: a polygon has {len(runs)} rings and this tool writes one") + count = {"Point": 1, "LineString": n, "Polygon": n + 1}[piece] + for run in runs: + if len(run) != count: + fail(f"feature {number}: a {piece} piece has {len(run)} positions and {count} were ordered") + for pos in run: + geo_position(pos, settings["precision"], dims) + if piece != "Point" and geo_crosses(run) != settings["antimeridian"]: + fail(f"feature {number}: a {piece} {'crosses' if geo_crosses(run) else 'does not cross'} " + f"the antimeridian and antimeridian={str(settings['antimeridian']).lower()} was ordered") + if piece == "Polygon": + geo_ring(run, settings) + + +def check_geojson(data, settings=None): + """A FeatureCollection to RFC 7946, made the way it was ordered. + + Parsing is CPython's json, and GDAL reads the same file in the reference + tool beside this. What only this layer asks: that every number carries the + decimal places ordered, that every outline is closed and wound the way + winding says - with longitudes unwrapped where antimeridian says the shape + crosses, because read flat such an outline is wound the other way and + crosses itself (measured 2026-10-07) - that the kinds take turns as + geometry says, that the ids run 1..N, and that the file is byte for byte + the text its layout makes of its own content. + + Measured 2026-10-07: GDAL takes a feature with no geometry member and a + latitude of 120 without a word. Both are refused here. + """ + import json + + given = settings or {} + settings = { + "geometry": given.get("geometry", "mixed"), + "formatting": given.get("formatting", "record-per-line"), + "precision": int(given.get("precision", "6")), + "altitude": given.get("altitude", "false") == "true", + "vertices": int(given.get("vertices", "8")), + "winding": given.get("winding", "rfc7946"), + "antimeridian": given.get("antimeridian", "false") == "true", + } + if data.startswith(b"\xef\xbb\xbf"): + fail("the file starts with a byte order mark") + try: + text = data.decode("utf-8") + doc = json.loads(text, parse_int=GeoNumber, parse_float=GeoNumber) + except (UnicodeDecodeError, ValueError) as exc: + fail(f"not valid UTF-8 JSON: {exc}") + if not isinstance(doc, dict) or list(doc) != ["type", "features"] or doc["type"] != "FeatureCollection": + fail("the root is not a FeatureCollection with its type and its features") + feats = doc["features"] + if not isinstance(feats, list) or not feats: + fail(f"the features member is {type(feats).__name__} with nothing in it rather than an array of features") + kinds = GEOJSON_KINDS if settings["geometry"] == "mixed" else [ + next(k for k in GEOJSON_KINDS if k.lower() == settings["geometry"])] + # The checks above name the shapes this tool could get wrong. A shape + # nobody thought of - a number where an array goes, deep inside - still has + # to come out as a refusal with a reason rather than a Python traceback, + # because a crash also turns a guard red and proves nothing (review of #171). + try: + for number, feat in enumerate(feats, start=1): + geo_feature(number, feat, settings, kinds) + except (TypeError, KeyError, IndexError, AttributeError, ValueError) as exc: + fail(f"a feature is not shaped the way this tool writes one: {type(exc).__name__}: {exc}") + spaces = geo_layout(text, doc, settings["formatting"]) + note = len(feats[-1]["properties"]["note"]) + if note > GEOJSON_NOTE_CAP or (spaces and note != GEOJSON_NOTE_CAP): + fail(f"the last note is {note} B with {spaces} spaces after the feature - " + f"spaces may only follow a note of exactly {GEOJSON_NOTE_CAP} B") + ok(f"{len(feats)} features, {settings['geometry']}, {spaces} trailing spaces") + + CHECKS = {"png": check_png, "wav": check_wav, "pdf": check_pdf, "zip": check_zip, "log": check_log, "csv": check_csv, "json": check_json, "xml": check_xml, "svg": check_svg, "html": check_html, "targz": check_targz, @@ -2162,12 +2385,12 @@ def check_mp4(data): "webm": check_webm, "mp4": check_mp4, "docx": check_docx, "xlsx": check_xlsx, "pptx": check_pptx, "txt": check_txt, "md": check_md, - "yaml": check_yaml, "toml": check_toml} + "yaml": check_yaml, "toml": check_toml, "geojson": check_geojson} # Checks that take the shape of the file as well as its bytes. Everything else # is handed the bytes alone, so adding a setting to one check cannot change how # any other one is called. -TAKES_SETTINGS = {"csv", "txt", "md", "json", "xml", "html"} +TAKES_SETTINGS = {"csv", "txt", "md", "json", "xml", "html", "geojson"} if __name__ == "__main__": if len(sys.argv) < 3 or sys.argv[1] not in CHECKS: diff --git a/web/assets/social-preview.png b/web/assets/social-preview.png index 5d38d8e0..341a793b 100644 Binary files a/web/assets/social-preview.png and b/web/assets/social-preview.png differ diff --git a/web/content/ar/site.json b/web/content/ar/site.json index 11412f40..ed905ead 100644 --- a/web/content/ar/site.json +++ b/web/content/ar/site.json @@ -259,6 +259,8 @@ "slides": "شرائح", "hertz": "هرتز", "megapixels": "ميغابكسل", + "decimal places": "منازل عشرية", + "points": "نقاط", "million cells": "مليون خلية", "entries per second": "إدخال في الثانية", "files": "ملفات", @@ -309,7 +311,7 @@ }, { "q": "ما الصيغ القادمة؟", - "a": "7z وmp3 وmp4. تعمل اليوم {{ .Facts.FormatCount }} صيغة من البداية إلى النهاية." + "a": "7z وmp3. تعمل اليوم {{ .Facts.FormatCount }} صيغة من البداية إلى النهاية." }, { "q": "على أي أنظمة يمكنني تشغيله؟", diff --git a/web/content/cs/site.json b/web/content/cs/site.json index c274687a..37d5b56b 100644 --- a/web/content/cs/site.json +++ b/web/content/cs/site.json @@ -258,6 +258,8 @@ "slides": "snímků", "hertz": "hertzů", "megapixels": "megapixelů", + "decimal places": "desetinných míst", + "points": "bodů", "million cells": "milionů buněk", "entries per second": "položek za sekundu", "files": "souborů", @@ -308,7 +310,7 @@ }, { "q": "Které formáty přijdou dál?", - "a": "7z, mp3 a mp4. Dnes funguje od začátku do konce {{ .Facts.FormatCount }} formátů." + "a": "7z a mp3. Dnes funguje od začátku do konce {{ .Facts.FormatCount }} formátů." }, { "q": "Na kterých systémech to mohu spustit?", diff --git a/web/content/de/site.json b/web/content/de/site.json index a9ac0a26..3e7e603f 100644 --- a/web/content/de/site.json +++ b/web/content/de/site.json @@ -258,6 +258,8 @@ "slides": "Folien", "hertz": "Hertz", "megapixels": "Megapixel", + "decimal places": "Nachkommastellen", + "points": "Punkte", "million cells": "Millionen Zellen", "entries per second": "Einträge pro Sekunde", "files": "Dateien", @@ -308,7 +310,7 @@ }, { "q": "Welche Formate kommen als Nächstes?", - "a": "7z, mp3 und mp4. {{ .Facts.FormatCount }} Formate funktionieren heute durchgängig." + "a": "7z und mp3. {{ .Facts.FormatCount }} Formate funktionieren heute durchgängig." }, { "q": "Auf welchen Systemen läuft es?", diff --git a/web/content/en/site.json b/web/content/en/site.json index bc08a36f..9a0acc44 100644 --- a/web/content/en/site.json +++ b/web/content/en/site.json @@ -255,6 +255,8 @@ "slides": "slides", "hertz": "hertz", "megapixels": "megapixels", + "decimal places": "decimal places", + "points": "points", "million cells": "million cells", "entries per second": "entries per second", "files": "files", @@ -305,7 +307,7 @@ }, { "q": "Which formats are coming next?", - "a": "7z, mp3 and mp4. {{ .Facts.FormatCount }} formats work end to end today." + "a": "7z and mp3. {{ .Facts.FormatCount }} formats work end to end today." }, { "q": "Which systems can I run it on?", diff --git a/web/content/es/site.json b/web/content/es/site.json index ec53110e..633fa5a8 100644 --- a/web/content/es/site.json +++ b/web/content/es/site.json @@ -258,6 +258,8 @@ "slides": "diapositivas", "hertz": "hercios", "megapixels": "megapíxeles", + "decimal places": "decimales", + "points": "puntos", "million cells": "millones de celdas", "entries per second": "entradas por segundo", "files": "archivos", @@ -308,7 +310,7 @@ }, { "q": "¿Qué formatos vienen después?", - "a": "7z, mp3 y mp4. Hoy funcionan de principio a fin {{ .Facts.FormatCount }} formatos." + "a": "7z y mp3. Hoy funcionan de principio a fin {{ .Facts.FormatCount }} formatos." }, { "q": "¿En qué sistemas puedo ejecutarlo?", diff --git a/web/content/fr/site.json b/web/content/fr/site.json index 31a692f5..b6279de4 100644 --- a/web/content/fr/site.json +++ b/web/content/fr/site.json @@ -258,6 +258,8 @@ "slides": "diapositives", "hertz": "hertz", "megapixels": "mégapixels", + "decimal places": "décimales", + "points": "points", "million cells": "millions de cellules", "entries per second": "entrées par seconde", "files": "fichiers", @@ -308,7 +310,7 @@ }, { "q": "Quels formats arrivent ensuite ?", - "a": "7z, mp3 et mp4. {{ .Facts.FormatCount }} formats fonctionnent de bout en bout aujourd'hui." + "a": "7z et mp3. {{ .Facts.FormatCount }} formats fonctionnent de bout en bout aujourd'hui." }, { "q": "Sur quels systèmes puis-je l'exécuter ?", diff --git a/web/content/hi/site.json b/web/content/hi/site.json index 17fce08b..758b7a52 100644 --- a/web/content/hi/site.json +++ b/web/content/hi/site.json @@ -258,6 +258,8 @@ "slides": "स्लाइड", "hertz": "हर्ट्ज़", "megapixels": "मेगापिक्सेल", + "decimal places": "दशमलव स्थान", + "points": "बिंदु", "million cells": "दस लाख सेल", "entries per second": "प्रति सेकंड प्रविष्टियाँ", "files": "फ़ाइलें", @@ -308,7 +310,7 @@ }, { "q": "आगे कौन से फ़ॉर्मैट आ रहे हैं?", - "a": "7z, mp3 और mp4। आज {{ .Facts.FormatCount }} फ़ॉर्मैट शुरू से अंत तक काम करते हैं।" + "a": "7z और mp3। आज {{ .Facts.FormatCount }} फ़ॉर्मैट शुरू से अंत तक काम करते हैं।" }, { "q": "मैं इसे किन सिस्टम पर चला सकता हूँ?", diff --git a/web/content/id/site.json b/web/content/id/site.json index 98482311..8acf32a1 100644 --- a/web/content/id/site.json +++ b/web/content/id/site.json @@ -258,6 +258,8 @@ "slides": "slide", "hertz": "hertz", "megapixels": "megapiksel", + "decimal places": "angka desimal", + "points": "titik", "million cells": "juta sel", "entries per second": "entri per detik", "files": "file", @@ -308,7 +310,7 @@ }, { "q": "Format apa yang akan hadir berikutnya?", - "a": "7z, mp3, dan mp4. Saat ini {{ .Facts.FormatCount }} format bekerja dari ujung ke ujung." + "a": "7z dan mp3. Saat ini {{ .Facts.FormatCount }} format bekerja dari ujung ke ujung." }, { "q": "Di sistem apa saya bisa menjalankannya?", diff --git a/web/content/it/site.json b/web/content/it/site.json index cbd7eeed..427fdb13 100644 --- a/web/content/it/site.json +++ b/web/content/it/site.json @@ -258,6 +258,8 @@ "slides": "diapositive", "hertz": "hertz", "megapixels": "megapixel", + "decimal places": "cifre decimali", + "points": "punti", "million cells": "milioni di celle", "entries per second": "voci al secondo", "files": "file", @@ -308,7 +310,7 @@ }, { "q": "Quali formati arrivano dopo?", - "a": "7z, mp3 e mp4. Oggi {{ .Facts.FormatCount }} formati funzionano da un capo all'altro." + "a": "7z e mp3. Oggi {{ .Facts.FormatCount }} formati funzionano da un capo all'altro." }, { "q": "Su quali sistemi posso eseguirlo?", diff --git a/web/content/ja/site.json b/web/content/ja/site.json index 70623c6c..ddb9fd8f 100644 --- a/web/content/ja/site.json +++ b/web/content/ja/site.json @@ -258,6 +258,8 @@ "slides": "スライド", "hertz": "ヘルツ", "megapixels": "メガピクセル", + "decimal places": "小数桁", + "points": "点", "million cells": "百万セル", "entries per second": "1秒あたりのエントリ数", "files": "ファイル", @@ -308,7 +310,7 @@ }, { "q": "次に対応する形式は何ですか。", - "a": "7z、mp3、mp4です。現在、{{ .Facts.FormatCount }}種類の形式がエンドツーエンドで動作します。" + "a": "7zとmp3です。現在、{{ .Facts.FormatCount }}種類の形式がエンドツーエンドで動作します。" }, { "q": "どのOSで動かせますか。", diff --git a/web/content/ko/site.json b/web/content/ko/site.json index e221e0a2..d80cd03e 100644 --- a/web/content/ko/site.json +++ b/web/content/ko/site.json @@ -258,6 +258,8 @@ "slides": "슬라이드", "hertz": "헤르츠", "megapixels": "메가픽셀", + "decimal places": "소수 자릿수", + "points": "점", "million cells": "백만 셀", "entries per second": "초당 항목 수", "files": "파일", @@ -308,7 +310,7 @@ }, { "q": "다음에는 어떤 형식이 추가되나요?", - "a": "7z, mp3, mp4입니다. 현재 {{ .Facts.FormatCount }}가지 형식이 처음부터 끝까지 동작합니다." + "a": "7z와 mp3입니다. 현재 {{ .Facts.FormatCount }}가지 형식이 처음부터 끝까지 동작합니다." }, { "q": "어떤 시스템에서 실행할 수 있나요?", diff --git a/web/content/nl/site.json b/web/content/nl/site.json index ed9c64e7..fa08aec2 100644 --- a/web/content/nl/site.json +++ b/web/content/nl/site.json @@ -258,6 +258,8 @@ "slides": "dia's", "hertz": "hertz", "megapixels": "megapixels", + "decimal places": "decimalen", + "points": "punten", "million cells": "miljoen cellen", "entries per second": "items per seconde", "files": "bestanden", @@ -308,7 +310,7 @@ }, { "q": "Welke formaten komen er nog?", - "a": "7z, mp3 en mp4. Vandaag werken {{ .Facts.FormatCount }} formaten van begin tot eind." + "a": "7z en mp3. Vandaag werken {{ .Facts.FormatCount }} formaten van begin tot eind." }, { "q": "Op welke systemen kan ik het draaien?", diff --git a/web/content/pl/site.json b/web/content/pl/site.json index 17b0ac5a..a5e1b9b5 100644 --- a/web/content/pl/site.json +++ b/web/content/pl/site.json @@ -255,6 +255,8 @@ "slides": "slajdów", "hertz": "herców", "megapixels": "megapikseli", + "decimal places": "miejsc po przecinku", + "points": "punktów", "million cells": "milionów komórek", "entries per second": "wpisów na sekundę", "files": "plików", @@ -305,7 +307,7 @@ }, { "q": "Jakie formaty są następne w kolejce?", - "a": "7z, mp3 i mp4. Formatów działających dziś od początku do końca jest {{ .Facts.FormatCount }}." + "a": "7z i mp3. Formatów działających dziś od początku do końca jest {{ .Facts.FormatCount }}." }, { "q": "Na jakich systemach to działa?", diff --git a/web/content/pt-BR/site.json b/web/content/pt-BR/site.json index 7ea8f199..66cf7ffb 100644 --- a/web/content/pt-BR/site.json +++ b/web/content/pt-BR/site.json @@ -258,6 +258,8 @@ "slides": "slides", "hertz": "hertz", "megapixels": "megapixels", + "decimal places": "casas decimais", + "points": "pontos", "million cells": "milhões de células", "entries per second": "entradas por segundo", "files": "arquivos", @@ -308,7 +310,7 @@ }, { "q": "Quais formatos vêm a seguir?", - "a": "7z, mp3 e mp4. Hoje {{ .Facts.FormatCount }} formatos funcionam de ponta a ponta." + "a": "7z e mp3. Hoje {{ .Facts.FormatCount }} formatos funcionam de ponta a ponta." }, { "q": "Em quais sistemas posso rodar?", diff --git a/web/content/ro/site.json b/web/content/ro/site.json index ae5f0cc7..355e87b3 100644 --- a/web/content/ro/site.json +++ b/web/content/ro/site.json @@ -258,6 +258,8 @@ "slides": "diapozitive", "hertz": "herți", "megapixels": "megapixeli", + "decimal places": "zecimale", + "points": "puncte", "million cells": "milioane de celule", "entries per second": "intrări pe secundă", "files": "fișiere", @@ -308,7 +310,7 @@ }, { "q": "Ce formate urmează?", - "a": "7z, mp3 și mp4. Azi funcționează de la un capăt la altul {{ .Facts.FormatCount }} formate." + "a": "7z și mp3. Azi funcționează de la un capăt la altul {{ .Facts.FormatCount }} formate." }, { "q": "Pe ce sisteme îl pot rula?", diff --git a/web/content/ru/site.json b/web/content/ru/site.json index 19923793..32e6c435 100644 --- a/web/content/ru/site.json +++ b/web/content/ru/site.json @@ -258,6 +258,8 @@ "slides": "слайдов", "hertz": "герц", "megapixels": "мегапикселей", + "decimal places": "знаков после запятой", + "points": "точек", "million cells": "миллионов ячеек", "entries per second": "записей в секунду", "files": "файлов", @@ -308,7 +310,7 @@ }, { "q": "Какие форматы появятся дальше?", - "a": "7z, mp3 и mp4. Сегодня полностью работают {{ .Facts.FormatCount }} форматов." + "a": "7z и mp3. Сегодня полностью работают {{ .Facts.FormatCount }} форматов." }, { "q": "На каких системах это можно запускать?", diff --git a/web/content/th/site.json b/web/content/th/site.json index 7a6c816a..67406b4c 100644 --- a/web/content/th/site.json +++ b/web/content/th/site.json @@ -258,6 +258,8 @@ "slides": "สไลด์", "hertz": "เฮิรตซ์", "megapixels": "เมกะพิกเซล", + "decimal places": "ตำแหน่งทศนิยม", + "points": "จุด", "million cells": "ล้านเซลล์", "entries per second": "รายการต่อวินาที", "files": "ไฟล์", @@ -308,7 +310,7 @@ }, { "q": "รูปแบบใดจะมาต่อไป", - "a": "7z, mp3 และ mp4 ตอนนี้ {{ .Facts.FormatCount }} รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ" + "a": "7z และ mp3 ตอนนี้ {{ .Facts.FormatCount }} รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ" }, { "q": "รันบนระบบใดได้บ้าง", diff --git a/web/content/tr/site.json b/web/content/tr/site.json index e8f2205f..eac4277e 100644 --- a/web/content/tr/site.json +++ b/web/content/tr/site.json @@ -258,6 +258,8 @@ "slides": "slayt", "hertz": "hertz", "megapixels": "megapiksel", + "decimal places": "ondalık basamak", + "points": "nokta", "million cells": "milyon hücre", "entries per second": "saniyedeki girdi", "files": "dosya", @@ -308,7 +310,7 @@ }, { "q": "Sırada hangi biçimler var?", - "a": "7z, mp3 ve mp4. Bugün {{ .Facts.FormatCount }} biçim uçtan uca çalışıyor." + "a": "7z ve mp3. Bugün {{ .Facts.FormatCount }} biçim uçtan uca çalışıyor." }, { "q": "Hangi sistemlerde çalıştırabilirim?", diff --git a/web/content/uk/site.json b/web/content/uk/site.json index 117732d4..30b1d1fe 100644 --- a/web/content/uk/site.json +++ b/web/content/uk/site.json @@ -258,6 +258,8 @@ "slides": "слайдів", "hertz": "герців", "megapixels": "мегапікселів", + "decimal places": "знаків після коми", + "points": "точок", "million cells": "мільйонів комірок", "entries per second": "записів на секунду", "files": "файлів", @@ -308,7 +310,7 @@ }, { "q": "Які формати з'являться далі?", - "a": "7z, mp3 і mp4. Сьогодні повністю працюють {{ .Facts.FormatCount }} форматів." + "a": "7z і mp3. Сьогодні повністю працюють {{ .Facts.FormatCount }} форматів." }, { "q": "У яких системах це можна запускати?", diff --git a/web/content/vi/site.json b/web/content/vi/site.json index 3a00f50b..df0122d2 100644 --- a/web/content/vi/site.json +++ b/web/content/vi/site.json @@ -258,6 +258,8 @@ "slides": "trang chiếu", "hertz": "hertz", "megapixels": "megapixel", + "decimal places": "chữ số thập phân", + "points": "điểm", "million cells": "triệu ô", "entries per second": "mục mỗi giây", "files": "tệp", @@ -308,7 +310,7 @@ }, { "q": "Những định dạng nào sắp có?", - "a": "7z, mp3 và mp4. Hôm nay có {{ .Facts.FormatCount }} định dạng hoạt động trọn vẹn từ đầu đến cuối." + "a": "7z và mp3. Hôm nay có {{ .Facts.FormatCount }} định dạng hoạt động trọn vẹn từ đầu đến cuối." }, { "q": "Tôi chạy nó trên những hệ thống nào?", diff --git a/web/content/zh-Hans/site.json b/web/content/zh-Hans/site.json index f2a90b0a..b41ad933 100644 --- a/web/content/zh-Hans/site.json +++ b/web/content/zh-Hans/site.json @@ -258,6 +258,8 @@ "slides": "幻灯片", "hertz": "赫兹", "megapixels": "百万像素", + "decimal places": "位小数", + "points": "个点", "million cells": "百万个单元格", "entries per second": "条目每秒", "files": "个文件", @@ -308,7 +310,7 @@ }, { "q": "接下来会支持哪些格式?", - "a": "7z、mp3 和 mp4。目前有 {{ .Facts.FormatCount }} 种格式可以端到端使用。" + "a": "7z 和 mp3。目前有 {{ .Facts.FormatCount }} 种格式可以端到端使用。" }, { "q": "我可以在哪些系统上运行?", diff --git a/web/content/zh-Hant/site.json b/web/content/zh-Hant/site.json index 46b36daf..07924577 100644 --- a/web/content/zh-Hant/site.json +++ b/web/content/zh-Hant/site.json @@ -258,6 +258,8 @@ "slides": "投影片", "hertz": "赫茲", "megapixels": "百萬像素", + "decimal places": "位小數", + "points": "個點", "million cells": "百萬個儲存格", "entries per second": "每秒項目數", "files": "個檔案", @@ -308,7 +310,7 @@ }, { "q": "接下來會支援哪些格式?", - "a": "7z、mp3 與 mp4。目前有 {{ .Facts.FormatCount }} 種格式可以端到端使用。" + "a": "7z 與 mp3。目前有 {{ .Facts.FormatCount }} 種格式可以端到端使用。" }, { "q": "我可以在哪些系統上執行?", diff --git a/web/public/ar/corrupt-test-files/index.html b/web/public/ar/corrupt-test-files/index.html index fcad1a99..609cede1 100644 --- a/web/public/ar/corrupt-test-files/index.html +++ b/web/public/ar/corrupt-test-files/index.html @@ -198,7 +198,7 @@

الملف التالف يبقى بالحجم الذي طلبته

tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

تُكتب الإعدادات بعد النقطتين. يمكن تكرار الخيار، وتُطبَّق أنواع التلف بالترتيب الذي تكتبه. ويعمل مع - كل واحدة من 28 صيغة. + كل واحدة من 29 صيغة.

diff --git a/web/public/ar/faq/index.html b/web/public/ar/faq/index.html index 03c29826..d5bfeb74 100644 --- a/web/public/ar/faq/index.html +++ b/web/public/ar/faq/index.html @@ -205,7 +205,7 @@

الأسئلة الشائعة

ما الصيغ القادمة؟

-

7z وmp3 وmp4. تعمل اليوم 28 صيغة من البداية إلى النهاية.

+

7z وmp3. تعمل اليوم 29 صيغة من البداية إلى النهاية.

@@ -276,7 +276,7 @@

الأسئلة الشائعة

{ "@type": "Question", "name": "ما الصيغ القادمة؟", - "acceptedAnswer": { "@type": "Answer", "text": "7z وmp3 وmp4. تعمل اليوم 28 صيغة من البداية إلى النهاية." } + "acceptedAnswer": { "@type": "Answer", "text": "7z وmp3. تعمل اليوم 29 صيغة من البداية إلى النهاية." } }, { "@type": "Question", diff --git a/web/public/ar/formats/index.html b/web/public/ar/formats/index.html index 6f55a2b5..b7f41085 100644 --- a/web/public/ar/formats/index.html +++ b/web/public/ar/formats/index.html @@ -4,8 +4,8 @@ -28 صيغة ملف مدعومة - PDF وDOCX وPNG وZIP وغيرها - +29 صيغة ملف مدعومة - PDF وDOCX وPNG وZIP وغيرها + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
-

28 صيغة ملف، كلٌّ منها يُولَّد بحجم دقيق

+

29 صيغة ملف، كلٌّ منها يُولَّد بحجم دقيق

كلٌّ منها ملف حقيقي من تلك الصيغة. يُفتح في البرنامج الذي يملكه، وعدد بايتاته هو ما طلبته بالضبط. ولا واحد منها أصفار حشوية أُلصق بها امتداد. @@ -195,6 +195,14 @@

28 صيغة ملف، كلٌّ منها يُولَّد بحجم دقيق

full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -495,6 +503,41 @@

الإعدادات التي تقبلها كل صيغة

paragraphs 1 - 50000 فقرات + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 منازل عشرية + + + + altitude + صحيح أو خاطئ + + + + vertices + 3 - 1000000 نقاط + + + + winding + reversed, rfc7946 + + + + antimeridian + صحيح أو خاطئ + gif width diff --git a/web/public/ar/index.html b/web/public/ar/index.html index 1b176946..e69c2b01 100644 --- a/web/public/ar/index.html +++ b/web/public/ar/index.html @@ -4,7 +4,7 @@ -مولّد ملفات الاختبار لضمان الجودة - حجم دقيق، 28 صيغة حقيقية +مولّد ملفات الاختبار لضمان الجودة - حجم دقيق، 29 صيغة حقيقية @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "مولّد ملفات اختبار مجاني ومفتوح المصدر لضمان الجودة. ينتج ملفات حقيقية بـ 28 صيغة وبحجم دقيق، ويكتب بيانًا يحدد كيف يجب أن يتفاعل النظام قيد الاختبار مع كل ملف.", + "description": "مولّد ملفات اختبار مجاني ومفتوح المصدر لضمان الجودة. ينتج ملفات حقيقية بـ 29 صيغة وبحجم دقيق، ويكتب بيانًا يحدد كيف يجب أن يتفاعل النظام قيد الاختبار مع كل ملف.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

ولّد ملفات اختبار حقيقية بحجم دقيق

- PDF وPNG وDOCX وZIP، 28 صيغة في المجمل، وكلٌّ منها ملف حقيقي + PDF وPNG وDOCX وZIP، 29 صيغة في المجمل، وكلٌّ منها ملف حقيقي يُفتح في البرنامج الذي يملكه، وبـالحجم الذي طلبته تمامًا. كما يدوّن كل تشغيل ما يجب أن يفعله تطبيقك بكل ملف. سطر أوامر ونافذة سطح مكتب، مجاني ومفتوح المصدر، ويعمل بالكامل على جهازك. @@ -179,7 +179,7 @@

ولّد ملفات اختبار حقيقية بحجم دقيق

  • - 28 + 29

    صيغة حقيقية، وكلٌّ منها يُفتح في البرنامج الذي يملكه

  • @@ -340,7 +340,7 @@

    مبني لمجموعة اختبارات تعمل دون إشراف

    اطلب 10485761 بايتًا واحصل على هذا العدد بالضبط. الحجم الذي لا تستطيع الصيغة بلوغه خطأ مع سبب، وليس ملفًا بحجم خاطئ أبدًا.

  • -

    28 صيغة حقيقية

    +

    29 صيغة حقيقية

    ليست أصفارًا حشوية بامتداد. يُفتح ملف PNG المولَّد في عارض الصور، ويُفتح DOCX في Word، ويُفك ضغط ZIP. وتُفحص كل صيغة بقرّاء مستقلين قبل إصدارها.

  • diff --git a/web/public/ar/presets/empty-and-minimal/index.html b/web/public/ar/presets/empty-and-minimal/index.html index 4e9cdf7a..6a825470 100644 --- a/web/public/ar/presets/empty-and-minimal/index.html +++ b/web/public/ar/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ أصغر ملفات اختبار صالحة وفارغة في كل صيغة - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

    ماذا في المجموعة؟

    - - - - + + + +
    الملفات30
    الأهداف في وصفته30
    الحجم الإجمالي39 263 B
    الصيغavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
    الملفات31
    الأهداف في وصفته31
    الحجم الإجمالي40 138 B
    الصيغavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
    @@ -192,7 +192,7 @@

    ماذا في المجموعة؟

    المتوقعالمعنىالملفات - acceptينبغي أن يقبل نظامك الملف.28 + acceptينبغي أن يقبل نظامك الملف.29 unspecifiedيعتمد على قواعد نظامك. أنت من يقرر، ثم تتحقق من أن ما يحدث هو ما قصدته.2 diff --git a/web/public/assets/social-preview.png b/web/public/assets/social-preview.png index 5d38d8e0..341a793b 100644 Binary files a/web/public/assets/social-preview.png and b/web/public/assets/social-preview.png differ diff --git a/web/public/corrupt-test-files/index.html b/web/public/corrupt-test-files/index.html index dc73fed7..c52528c8 100644 --- a/web/public/corrupt-test-files/index.html +++ b/web/public/corrupt-test-files/index.html @@ -201,7 +201,7 @@

    A damaged file is still the size you asked for

    tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

    Settings go after a colon. The flag can be repeated, and the damages are applied in the order you - write them. It works with every one of the 28 formats. + write them. It works with every one of the 29 formats.

    diff --git a/web/public/cs/faq/index.html b/web/public/cs/faq/index.html index dd813888..fdb042d2 100644 --- a/web/public/cs/faq/index.html +++ b/web/public/cs/faq/index.html @@ -206,7 +206,7 @@

    Často kladené otázky

    Které formáty přijdou dál?

    -

    7z, mp3 a mp4. Dnes funguje od začátku do konce 28 formátů.

    +

    7z a mp3. Dnes funguje od začátku do konce 29 formátů.

    @@ -277,7 +277,7 @@

    Často kladené otázky

    { "@type": "Question", "name": "Které formáty přijdou dál?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 a mp4. Dnes funguje od začátku do konce 28 formátů." } + "acceptedAnswer": { "@type": "Answer", "text": "7z a mp3. Dnes funguje od začátku do konce 29 formátů." } }, { "@type": "Question", diff --git a/web/public/cs/formaty/index.html b/web/public/cs/formaty/index.html index ba856e2d..adc5b009 100644 --- a/web/public/cs/formaty/index.html +++ b/web/public/cs/formaty/index.html @@ -4,8 +4,8 @@ -28 podporovaných formátů souborů - PDF, DOCX, PNG, ZIP a další - +29 podporovaných formátů souborů - PDF, DOCX, PNG, ZIP a další + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
    -

    28 formátů souborů, každý generovaný v přesné velikosti

    +

    29 formátů souborů, každý generovaný v přesné velikosti

    Každý z nich je skutečný soubor toho formátu. Otevře se v programu, kam patří, a má přesně tolik bajtů, kolik jste požádali. Žádný není vycpávka z nul s přilepenou příponou. @@ -195,6 +195,14 @@

    28 formátů souborů, každý generovaný v přesné velikosti

    full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -496,6 +504,41 @@

    Nastavení, která každý formát přijímá

    paragraphs 1 - 50000 odstavců + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 desetinných míst + + + + altitude + pravda nebo nepravda + + + + vertices + 3 - 1000000 bodů + + + + winding + reversed, rfc7946 + + + + antimeridian + pravda nebo nepravda + gif width diff --git a/web/public/cs/index.html b/web/public/cs/index.html index f75d7a84..582bd83b 100644 --- a/web/public/cs/index.html +++ b/web/public/cs/index.html @@ -4,7 +4,7 @@ -Generátor testovacích souborů - přesná velikost, 28 formátů +Generátor testovacích souborů - přesná velikost, 29 formátů @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Bezplatný open source generátor testovacích souborů pro QA. Vytváří skutečné soubory v 28 formátech v přesné velikosti a zapisuje manifest, který říká, jak má testovaný systém na každý z nich reagovat.", + "description": "Bezplatný open source generátor testovacích souborů pro QA. Vytváří skutečné soubory v 29 formátech v přesné velikosti a zapisuje manifest, který říká, jak má testovaný systém na každý z nich reagovat.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

    Generujte skutečné testovací soubory v přesné velikosti

    - PDF, PNG, DOCX, ZIP - celkem 28 formátů a každý je skutečný + PDF, PNG, DOCX, ZIP - celkem 29 formátů a každý je skutečný soubor, který se otevře v programu, kam patří, v přesně té velikosti, o kterou jste požádali. Každý běh také zapisuje, co má vaše aplikace s každým souborem udělat. Příkazový řádek a desktopové okno, zdarma a open source, celé na vašem počítači. @@ -179,7 +179,7 @@

    Generujte skutečné testovací soubory v přesné velikosti

    • - 28 + 29

      skutečných formátů, každý se otevře v programu, kam patří

    • @@ -341,7 +341,7 @@

      Vytvořeno pro sadu testů, která běží bez dozoru

      Požádejte o 10485761 bajtů a dostanete přesně tolik. Velikost, které formát nedosáhne, je chyba s důvodem, nikdy soubor špatné velikosti.

    • -

      28 skutečných formátů

      +

      29 skutečných formátů

      Ne vycpávkové nuly s příponou. Vygenerované PNG se otevře v prohlížeči obrázků, DOCX ve Wordu, ZIP se rozbalí. Každý formát je před vydáním ověřen nezávislými čtečkami.

    • diff --git a/web/public/cs/poskozene-testovaci-soubory/index.html b/web/public/cs/poskozene-testovaci-soubory/index.html index 69a3724d..e88cf87a 100644 --- a/web/public/cs/poskozene-testovaci-soubory/index.html +++ b/web/public/cs/poskozene-testovaci-soubory/index.html @@ -200,7 +200,7 @@

      Poškozený soubor má stále velikost, kterou jste chtěli

      tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

      Nastavení se píše za dvojtečku. Přepínač lze opakovat a poškození se použijí v pořadí, v jakém je - zapíšete. Funguje s každým z 28 formátů. + zapíšete. Funguje s každým z 29 formátů.

      diff --git a/web/public/cs/predvolby/empty-and-minimal/index.html b/web/public/cs/predvolby/empty-and-minimal/index.html index 4917cf82..7bd23693 100644 --- a/web/public/cs/predvolby/empty-and-minimal/index.html +++ b/web/public/cs/predvolby/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Nejmenší platné a prázdné testovací soubory v každém formátu - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

      Co je v sadě?

      - - - - + + + +
      Soubory30
      Targety v receptu30
      Celková velikost39 263 B
      Formátyavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
      Soubory31
      Targety v receptu31
      Celková velikost40 138 B
      Formátyavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
      @@ -192,7 +192,7 @@

      Co je v sadě?

      OčekávánoVýznamSoubory - acceptVáš systém má soubor přijmout.28 + acceptVáš systém má soubor přijmout.29 unspecifiedZáleží na pravidlech vašeho systému. Rozhodnete vy, a pak ověříte, že to, co se stane, je to, co jste chtěli.2 diff --git a/web/public/de/beschaedigte-testdateien/index.html b/web/public/de/beschaedigte-testdateien/index.html index c9927666..c2d28324 100644 --- a/web/public/de/beschaedigte-testdateien/index.html +++ b/web/public/de/beschaedigte-testdateien/index.html @@ -203,7 +203,7 @@

      Eine beschädigte Datei hat trotzdem die verlangte Größe

      Einstellungen stehen nach einem Doppelpunkt. Die Option lässt sich wiederholen, und die Beschädigungen werden in der Reihenfolge angewendet, in der Sie sie schreiben. Es funktioniert - mit allen 28 Formaten. + mit allen 29 Formaten.

      diff --git a/web/public/de/faq/index.html b/web/public/de/faq/index.html index ac583eed..4a95c26f 100644 --- a/web/public/de/faq/index.html +++ b/web/public/de/faq/index.html @@ -206,7 +206,7 @@

      Häufig gestellte Fragen

      Welche Formate kommen als Nächstes?

      -

      7z, mp3 und mp4. 28 Formate funktionieren heute durchgängig.

      +

      7z und mp3. 29 Formate funktionieren heute durchgängig.

      @@ -277,7 +277,7 @@

      Häufig gestellte Fragen

      { "@type": "Question", "name": "Welche Formate kommen als Nächstes?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 und mp4. 28 Formate funktionieren heute durchgängig." } + "acceptedAnswer": { "@type": "Answer", "text": "7z und mp3. 29 Formate funktionieren heute durchgängig." } }, { "@type": "Question", diff --git a/web/public/de/formate/index.html b/web/public/de/formate/index.html index 9d8d2bf9..a0d58e8e 100644 --- a/web/public/de/formate/index.html +++ b/web/public/de/formate/index.html @@ -4,8 +4,8 @@ -28 unterstützte Dateiformate - PDF, DOCX, PNG, ZIP und mehr - +29 unterstützte Dateiformate - PDF, DOCX, PNG, ZIP und mehr + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
      -

      28 Dateiformate, jedes in exakter Größe erzeugt

      +

      29 Dateiformate, jedes in exakter Größe erzeugt

      Jedes davon ist eine echte Datei dieses Formats. Sie öffnet sich in der Software, zu der sie gehört, und hat genau die Byte-Zahl, die du verlangt hast. Keines davon besteht aus @@ -196,6 +196,14 @@

      28 Dateiformate, jedes in exakter Größe erzeugt

      full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -498,6 +506,41 @@

      Einstellungen, die jedes Format kennt

      paragraphs 1 - 50000 Absätze + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 Nachkommastellen + + + + altitude + wahr oder falsch + + + + vertices + 3 - 1000000 Punkte + + + + winding + reversed, rfc7946 + + + + antimeridian + wahr oder falsch + gif width diff --git a/web/public/de/index.html b/web/public/de/index.html index 82e87105..c130da0e 100644 --- a/web/public/de/index.html +++ b/web/public/de/index.html @@ -4,7 +4,7 @@ -Testdatei-Generator für QA - exakte Größe, 28 echte Formate +Testdatei-Generator für QA - exakte Größe, 29 echte Formate @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Ein kostenloser Open-Source-Generator für Testdateien in der QA. Er erzeugt echte Dateien in 28 Formaten in jeder exakten Größe und schreibt ein Manifest, das beschreibt, wie das getestete System auf jede Datei reagieren soll.", + "description": "Ein kostenloser Open-Source-Generator für Testdateien in der QA. Er erzeugt echte Dateien in 29 Formaten in jeder exakten Größe und schreibt ein Manifest, das beschreibt, wie das getestete System auf jede Datei reagieren soll.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

      Echte Testdateien in jeder exakten Größe erzeugen

      - PDF, PNG, DOCX, ZIP - insgesamt 28 Formate, und jedes ist + PDF, PNG, DOCX, ZIP - insgesamt 29 Formate, und jedes ist eine echte Datei, die sich in der Software öffnet, zu der sie gehört, in genau der Größe, die du verlangt hast. Jeder Lauf hält außerdem fest, was deine Anwendung mit jeder Datei tun soll. Kommandozeile und Desktop-Fenster, kostenlos und Open Source, vollständig @@ -180,7 +180,7 @@

      Echte Testdateien in jeder exakten Größe erzeugen

      • - 28 + 29

        echte Formate, jedes öffnet sich in der Software, zu der es gehört

      • @@ -345,7 +345,7 @@

        Gebaut für eine Testsuite, die unbeaufsichtigt läuft

        Verlange 10485761 Bytes und bekomme genau das. Eine Größe, die ein Format nicht erreichen kann, ist ein Fehler mit Begründung, nie eine Datei in der falschen Größe.

      • -

        28 echte Formate

        +

        29 echte Formate

        Keine aufgefüllten Nullen mit einer Endung. Ein erzeugtes PNG öffnet sich im Bildbetrachter, ein DOCX in Word, ein ZIP lässt sich entpacken. Jedes wird vor der Auslieferung mit unabhängigen Readern geprüft.

      • diff --git a/web/public/de/presets/empty-and-minimal/index.html b/web/public/de/presets/empty-and-minimal/index.html index 98e98355..ac25dc11 100644 --- a/web/public/de/presets/empty-and-minimal/index.html +++ b/web/public/de/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Kleinste gültige und leere Testdateien in jedem Format - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

        Was steckt im Set?

        - - - - + + + +
        Dateien30
        Targets in seinem Rezept30
        Gesamtgröße39 263 B
        Formateavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
        Dateien31
        Targets in seinem Rezept31
        Gesamtgröße40 138 B
        Formateavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
        @@ -192,7 +192,7 @@

        Was steckt im Set?

        ErwartetBedeutungDateien - acceptDein System soll die Datei annehmen.28 + acceptDein System soll die Datei annehmen.29 unspecifiedDas hängt von den Regeln deines Systems ab. Du entscheidest, dann prüfst du, ob das Ergebnis dem entspricht, was du gemeint hast.2 diff --git a/web/public/es/archivos-de-prueba-corruptos/index.html b/web/public/es/archivos-de-prueba-corruptos/index.html index d5de7876..c93e4676 100644 --- a/web/public/es/archivos-de-prueba-corruptos/index.html +++ b/web/public/es/archivos-de-prueba-corruptos/index.html @@ -201,7 +201,7 @@

        Un archivo dañado conserva el tamaño que pediste

        tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

        Los ajustes van después de dos puntos. La opción se puede repetir, y los daños se aplican en el - orden en que los escribes. Funciona con cada uno de los 28 formatos. + orden en que los escribes. Funciona con cada uno de los 29 formatos.

        diff --git a/web/public/es/formatos/index.html b/web/public/es/formatos/index.html index bc8b2bf3..e43ec92c 100644 --- a/web/public/es/formatos/index.html +++ b/web/public/es/formatos/index.html @@ -4,8 +4,8 @@ -28 formatos de archivo - PDF, DOCX, PNG, ZIP y más - +29 formatos de archivo - PDF, DOCX, PNG, ZIP y más + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
        -

        28 formatos de archivo, cada uno generado a un tamaño exacto

        +

        29 formatos de archivo, cada uno generado a un tamaño exacto

        Cada uno es un archivo real de ese formato. Se abre en el programa que le corresponde y tiene exactamente el número de bytes que pediste. Ninguno es relleno de ceros con @@ -196,6 +196,14 @@

        28 formatos de archivo, cada uno generado a un tamaño exacto

        full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -499,6 +507,41 @@

        Ajustes que admite cada formato

        paragraphs 1 - 50000 párrafos + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 decimales + + + + altitude + verdadero o falso + + + + vertices + 3 - 1000000 puntos + + + + winding + reversed, rfc7946 + + + + antimeridian + verdadero o falso + gif width diff --git a/web/public/es/index.html b/web/public/es/index.html index 7bae103d..07078c21 100644 --- a/web/public/es/index.html +++ b/web/public/es/index.html @@ -4,7 +4,7 @@ -Generador de archivos de prueba - tamaño exacto, 28 formatos +Generador de archivos de prueba - tamaño exacto, 29 formatos @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Un generador gratuito y de código abierto de archivos de prueba para QA. Produce archivos reales de 28 formatos al tamaño exacto y escribe un manifiesto que dice cómo debe reaccionar el sistema bajo prueba a cada uno.", + "description": "Un generador gratuito y de código abierto de archivos de prueba para QA. Produce archivos reales de 29 formatos al tamaño exacto y escribe un manifiesto que dice cómo debe reaccionar el sistema bajo prueba a cada uno.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

        Genera archivos de prueba reales al tamaño exacto

        - PDF, PNG, DOCX, ZIP - 28 formatos en total, y cada uno es un + PDF, PNG, DOCX, ZIP - 29 formatos en total, y cada uno es un archivo real que se abre en el programa que le corresponde, con exactamente el tamaño que pediste. Cada ejecución también anota qué debe hacer tu aplicación con cada archivo. Línea de comandos y ventana de escritorio, gratis y de código abierto, funcionando por @@ -180,7 +180,7 @@

        Genera archivos de prueba reales al tamaño exacto

        • - 28 + 29

          formatos reales, cada uno se abre en el programa que le corresponde

        • @@ -345,7 +345,7 @@

          Pensado para un conjunto de pruebas que corre sin supervisión

          Pide 10485761 bytes y obtén exactamente eso. Un tamaño que un formato no puede alcanzar es un error con un motivo, nunca un archivo del tamaño equivocado.

        • -

          28 formatos reales

          +

          29 formatos reales

          No ceros de relleno con una extensión. Un PNG generado se abre en un visor de imágenes, un DOCX se abre en Word, un ZIP se extrae. Cada uno se comprueba con lectores independientes antes de publicarse.

        • diff --git a/web/public/es/preguntas-frecuentes/index.html b/web/public/es/preguntas-frecuentes/index.html index 452b090b..ec2f33fe 100644 --- a/web/public/es/preguntas-frecuentes/index.html +++ b/web/public/es/preguntas-frecuentes/index.html @@ -206,7 +206,7 @@

          Preguntas frecuentes

          ¿Qué formatos vienen después?

          -

          7z, mp3 y mp4. Hoy funcionan de principio a fin 28 formatos.

          +

          7z y mp3. Hoy funcionan de principio a fin 29 formatos.

          @@ -277,7 +277,7 @@

          Preguntas frecuentes

          { "@type": "Question", "name": "¿Qué formatos vienen después?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 y mp4. Hoy funcionan de principio a fin 28 formatos." } + "acceptedAnswer": { "@type": "Answer", "text": "7z y mp3. Hoy funcionan de principio a fin 29 formatos." } }, { "@type": "Question", diff --git a/web/public/es/presets/empty-and-minimal/index.html b/web/public/es/presets/empty-and-minimal/index.html index 971e3221..e13377a9 100644 --- a/web/public/es/presets/empty-and-minimal/index.html +++ b/web/public/es/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Archivos de prueba válidos mínimos y vacíos en cada formato - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

          ¿Qué hay en el conjunto?

          - - - - + + + +
          Archivos30
          Targets en su receta30
          Tamaño total39 263 B
          Formatosavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
          Archivos31
          Targets en su receta31
          Tamaño total40 138 B
          Formatosavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
          @@ -193,7 +193,7 @@

          ¿Qué hay en el conjunto?

          EsperadoSignificadoArchivos - acceptTu sistema debe aceptar el archivo.28 + acceptTu sistema debe aceptar el archivo.29 unspecifiedDepende de las reglas de tu sistema. Tú decides y después compruebas que lo que ocurre es lo que querías.2 diff --git a/web/public/faq/index.html b/web/public/faq/index.html index 9a7b64a6..a8608e77 100644 --- a/web/public/faq/index.html +++ b/web/public/faq/index.html @@ -205,7 +205,7 @@

          Frequently asked questions

          Which formats are coming next?

          -

          7z, mp3 and mp4. 28 formats work end to end today.

          +

          7z and mp3. 29 formats work end to end today.

          @@ -276,7 +276,7 @@

          Frequently asked questions

          { "@type": "Question", "name": "Which formats are coming next?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 and mp4. 28 formats work end to end today." } + "acceptedAnswer": { "@type": "Answer", "text": "7z and mp3. 29 formats work end to end today." } }, { "@type": "Question", diff --git a/web/public/formats/index.html b/web/public/formats/index.html index 8b0ae47d..db8f24ac 100644 --- a/web/public/formats/index.html +++ b/web/public/formats/index.html @@ -4,8 +4,8 @@ -28 Supported File Formats - PDF, DOCX, PNG, ZIP and More - +29 Supported File Formats - PDF, DOCX, PNG, ZIP and More + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
          -

          28 file formats, every one generated at an exact size

          +

          29 file formats, every one generated at an exact size

          Each of these is a real file of that format. It opens in the software that owns it, and it is exactly the number of bytes you asked for. None of them is padded zeros with an extension @@ -196,6 +196,14 @@

          28 file formats, every one generated at an exact size

          full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

          Settings each format accepts

          paragraphs 1 - 50000 paragraphs + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 decimal places + + + + altitude + true or false + + + + vertices + 3 - 1000000 points + + + + winding + reversed, rfc7946 + + + + antimeridian + true or false + gif width diff --git a/web/public/fr/faq/index.html b/web/public/fr/faq/index.html index 15a20043..c3b978ad 100644 --- a/web/public/fr/faq/index.html +++ b/web/public/fr/faq/index.html @@ -206,7 +206,7 @@

          Questions fréquentes

          Quels formats arrivent ensuite ?

          -

          7z, mp3 et mp4. 28 formats fonctionnent de bout en bout aujourd'hui.

          +

          7z et mp3. 29 formats fonctionnent de bout en bout aujourd'hui.

          @@ -277,7 +277,7 @@

          Questions fréquentes

          { "@type": "Question", "name": "Quels formats arrivent ensuite ?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 et mp4. 28 formats fonctionnent de bout en bout aujourd\u0027hui." } + "acceptedAnswer": { "@type": "Answer", "text": "7z et mp3. 29 formats fonctionnent de bout en bout aujourd\u0027hui." } }, { "@type": "Question", diff --git a/web/public/fr/fichiers-de-test-corrompus/index.html b/web/public/fr/fichiers-de-test-corrompus/index.html index 59fa9387..887ea45f 100644 --- a/web/public/fr/fichiers-de-test-corrompus/index.html +++ b/web/public/fr/fichiers-de-test-corrompus/index.html @@ -202,7 +202,7 @@

          Un fichier abîmé garde la taille demandée

          tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

          Les réglages se placent après deux-points. L'option peut être répétée, et les dommages s'appliquent - dans l'ordre où vous les écrivez. Ça marche avec chacun des 28 formats. + dans l'ordre où vous les écrivez. Ça marche avec chacun des 29 formats.

          diff --git a/web/public/fr/formats/index.html b/web/public/fr/formats/index.html index 2de9c31f..109c3599 100644 --- a/web/public/fr/formats/index.html +++ b/web/public/fr/formats/index.html @@ -4,8 +4,8 @@ -28 formats de fichiers - PDF, DOCX, PNG, ZIP et plus - +29 formats de fichiers - PDF, DOCX, PNG, ZIP et plus + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
          -

          28 formats de fichiers, chacun généré à une taille exacte

          +

          29 formats de fichiers, chacun généré à une taille exacte

          Chacun est un vrai fichier de ce format. Il s'ouvre dans le logiciel qui lui correspond et fait exactement le nombre d'octets que vous avez demandé. Aucun n'est du remplissage @@ -196,6 +196,14 @@

          28 formats de fichiers, chacun généré à une taille exacte

          full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -499,6 +507,41 @@

          Réglages que chaque format accepte

          paragraphs 1 - 50000 paragraphes + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 décimales + + + + altitude + vrai ou faux + + + + vertices + 3 - 1000000 points + + + + winding + reversed, rfc7946 + + + + antimeridian + vrai ou faux + gif width diff --git a/web/public/fr/index.html b/web/public/fr/index.html index 71dd8be7..28a5e48f 100644 --- a/web/public/fr/index.html +++ b/web/public/fr/index.html @@ -4,7 +4,7 @@ -Générateur de fichiers de test - taille exacte, 28 vrais formats +Générateur de fichiers de test - taille exacte, 29 vrais formats @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Un générateur gratuit et open source de fichiers de test pour la QA. Il produit de vrais fichiers dans 28 formats, à la taille exacte, et écrit un manifeste qui dit comment le système testé doit réagir à chacun.", + "description": "Un générateur gratuit et open source de fichiers de test pour la QA. Il produit de vrais fichiers dans 29 formats, à la taille exacte, et écrit un manifeste qui dit comment le système testé doit réagir à chacun.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

          Générez de vrais fichiers de test à la taille exacte

          - PDF, PNG, DOCX, ZIP - 28 formats au total, et chacun est un + PDF, PNG, DOCX, ZIP - 29 formats au total, et chacun est un vrai fichier qui s'ouvre dans le logiciel qui lui correspond, à la taille exacte que vous avez demandée. Chaque exécution note aussi ce que votre application doit faire de chaque fichier. Ligne de commande et fenêtre de bureau, gratuit et open source, entièrement sur @@ -180,7 +180,7 @@

          Générez de vrais fichiers de test à la taille exacte

          • - 28 + 29

            vrais formats, chacun s'ouvrant dans le logiciel qui lui correspond

          • @@ -345,7 +345,7 @@

            Conçu pour une suite qui tourne sans surveillance

            Demandez 10485761 octets et obtenez exactement cela. Une taille qu'un format ne peut pas atteindre est une erreur avec une raison, jamais un fichier de mauvaise taille.

          • -

            28 vrais formats

            +

            29 vrais formats

            Pas des zéros de remplissage avec une extension. Un PNG généré s'ouvre dans une visionneuse d'images, un DOCX s'ouvre dans Word, un ZIP se décompresse. Chacun est vérifié avec des lecteurs indépendants avant d'être livré.

          • diff --git a/web/public/fr/prereglages/empty-and-minimal/index.html b/web/public/fr/prereglages/empty-and-minimal/index.html index 37b20d9f..a50c5377 100644 --- a/web/public/fr/prereglages/empty-and-minimal/index.html +++ b/web/public/fr/prereglages/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Fichiers de test valides minimaux et vides, dans chaque format - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

            Que contient le jeu ?

            - - - - + + + +
            Fichiers30
            Cibles dans sa recette30
            Taille totale39 263 B
            Formatsavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
            Fichiers31
            Cibles dans sa recette31
            Taille totale40 138 B
            Formatsavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
            @@ -193,7 +193,7 @@

            Que contient le jeu ?

            AttenduSignificationFichiers - acceptVotre système doit accepter le fichier.28 + acceptVotre système doit accepter le fichier.29 unspecifiedCela dépend des règles de votre système. Vous décidez, puis vous vérifiez que ce qui se passe est ce que vous aviez voulu.2 diff --git a/web/public/hi/corrupt-test-files/index.html b/web/public/hi/corrupt-test-files/index.html index 36f76e09..1462b465 100644 --- a/web/public/hi/corrupt-test-files/index.html +++ b/web/public/hi/corrupt-test-files/index.html @@ -200,7 +200,7 @@

            खराब फ़ाइल का आकार वही रहता ह tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

            सेटिंग कोलन के बाद लिखी जाती है। विकल्प दोहराया जा सकता है, और बिगाड़ आपके लिखे क्रम में लागू होते - हैं। यह सभी 28 फ़ॉर्मैट के साथ चलता है। + हैं। यह सभी 29 फ़ॉर्मैट के साथ चलता है।

            diff --git a/web/public/hi/faq/index.html b/web/public/hi/faq/index.html index 88b6ca8d..e090f32f 100644 --- a/web/public/hi/faq/index.html +++ b/web/public/hi/faq/index.html @@ -205,7 +205,7 @@

            अक्सर पूछे जाने वाले सवाल

            आगे कौन से फ़ॉर्मैट आ रहे हैं?

            -

            7z, mp3 और mp4। आज 28 फ़ॉर्मैट शुरू से अंत तक काम करते हैं।

            +

            7z और mp3। आज 29 फ़ॉर्मैट शुरू से अंत तक काम करते हैं।

            @@ -276,7 +276,7 @@

            अक्सर पूछे जाने वाले सवाल

            { "@type": "Question", "name": "आगे कौन से फ़ॉर्मैट आ रहे हैं?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 और mp4। आज 28 फ़ॉर्मैट शुरू से अंत तक काम करते हैं।" } + "acceptedAnswer": { "@type": "Answer", "text": "7z और mp3। आज 29 फ़ॉर्मैट शुरू से अंत तक काम करते हैं।" } }, { "@type": "Question", diff --git a/web/public/hi/formats/index.html b/web/public/hi/formats/index.html index 154167bd..94469fe8 100644 --- a/web/public/hi/formats/index.html +++ b/web/public/hi/formats/index.html @@ -4,8 +4,8 @@ -28 समर्थित फ़ाइल फ़ॉर्मैट - PDF, DOCX, PNG, ZIP और अन्य - +29 समर्थित फ़ाइल फ़ॉर्मैट - PDF, DOCX, PNG, ZIP और अन्य + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
            -

            28 फ़ाइल फ़ॉर्मैट, हर एक सटीक आकार में बनाया गया

            +

            29 फ़ाइल फ़ॉर्मैट, हर एक सटीक आकार में बनाया गया

            इनमें से हर एक उस फ़ॉर्मैट की असली फ़ाइल है। वह अपने सॉफ़्टवेयर में खुलती है और उसमें ठीक उतने बाइट हैं जितने आपने माँगे। इनमें से कोई भी एक्सटेंशन चिपकाए गए भराव के शून्य नहीं @@ -196,6 +196,14 @@

            28 फ़ाइल फ़ॉर्मैट, हर एक सटीक आ full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

            हर फ़ॉर्मैट की स्वीकार की जा paragraphs 1 - 50000 अनुच्छेद + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 दशमलव स्थान + + + + altitude + सही या गलत + + + + vertices + 3 - 1000000 बिंदु + + + + winding + reversed, rfc7946 + + + + antimeridian + सही या गलत + gif width diff --git a/web/public/hi/index.html b/web/public/hi/index.html index 24a37f25..d584df10 100644 --- a/web/public/hi/index.html +++ b/web/public/hi/index.html @@ -4,7 +4,7 @@ -QA के लिए टेस्ट फ़ाइल जनरेटर - सटीक आकार, 28 असली फ़ॉर्मैट +QA के लिए टेस्ट फ़ाइल जनरेटर - सटीक आकार, 29 असली फ़ॉर्मैट @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "QA के लिए मुफ़्त और ओपन सोर्स टेस्ट फ़ाइल जनरेटर। यह 28 फ़ॉर्मैट में सटीक आकार की असली फ़ाइलें बनाता है और एक मैनिफ़ेस्ट लिखता है जो बताता है कि जाँचे जा रहे सिस्टम को हर फ़ाइल पर क्या प्रतिक्रिया देनी चाहिए।", + "description": "QA के लिए मुफ़्त और ओपन सोर्स टेस्ट फ़ाइल जनरेटर। यह 29 फ़ॉर्मैट में सटीक आकार की असली फ़ाइलें बनाता है और एक मैनिफ़ेस्ट लिखता है जो बताता है कि जाँचे जा रहे सिस्टम को हर फ़ाइल पर क्या प्रतिक्रिया देनी चाहिए।", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

            सटीक आकार की असली टेस्ट फ़ाइलें बनाएँ

            - PDF, PNG, DOCX, ZIP - कुल 28 फ़ॉर्मैट, और हर एक असली फ़ाइल है + PDF, PNG, DOCX, ZIP - कुल 29 फ़ॉर्मैट, और हर एक असली फ़ाइल है जो अपने सॉफ़्टवेयर में खुलती है, ठीक उसी आकार में जो आपने माँगा। हर रन यह भी लिखता है कि आपके एप्लिकेशन को हर फ़ाइल के साथ क्या करना चाहिए। कमांड लाइन और डेस्कटॉप विंडो, मुफ़्त और ओपन सोर्स, पूरी तरह आपकी मशीन पर चलता है। @@ -179,7 +179,7 @@

            सटीक आकार की असली टेस्ट फ़ाइ
            • - 28 + 29

              असली फ़ॉर्मैट, हर एक अपने सॉफ़्टवेयर में खुलता है

            • @@ -341,7 +341,7 @@

              बिना निगरानी के चलने वाले सू

              10485761 बाइट माँगें और ठीक वही पाएँ। जिस आकार तक कोई फ़ॉर्मैट नहीं पहुँच सकता, वह कारण सहित त्रुटि है, गलत आकार की फ़ाइल कभी नहीं।

            • -

              28 असली फ़ॉर्मैट

              +

              29 असली फ़ॉर्मैट

              एक्सटेंशन वाले भराव के शून्य नहीं। बनाई गई PNG इमेज व्यूअर में खुलती है, DOCX Word में खुलता है, ZIP खुल जाता है। हर एक को भेजने से पहले स्वतंत्र रीडरों से जाँचा जाता है।

            • diff --git a/web/public/hi/presets/empty-and-minimal/index.html b/web/public/hi/presets/empty-and-minimal/index.html index b4c85f99..48183cf1 100644 --- a/web/public/hi/presets/empty-and-minimal/index.html +++ b/web/public/hi/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ हर फ़ॉर्मैट की सबसे छोटी वैध और खाली टेस्ट फ़ाइलें - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

              सेट में क्या है?

              - - - - + + + +
              फ़ाइलें30
              इसकी रेसिपी में टार्गेट30
              कुल आकार39 263 B
              फ़ॉर्मैटavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
              फ़ाइलें31
              इसकी रेसिपी में टार्गेट31
              कुल आकार40 138 B
              फ़ॉर्मैटavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
              @@ -192,7 +192,7 @@

              सेट में क्या है?

              अपेक्षितअर्थफ़ाइलें - acceptआपके सिस्टम को फ़ाइल मंज़ूर करनी चाहिए।28 + acceptआपके सिस्टम को फ़ाइल मंज़ूर करनी चाहिए।29 unspecifiedयह आपके सिस्टम के नियमों पर निर्भर है। आप तय करें, फिर जाँचें कि जो होता है वही है जो आप चाहते थे।2 diff --git a/web/public/id/faq/index.html b/web/public/id/faq/index.html index f0575576..8cfb309d 100644 --- a/web/public/id/faq/index.html +++ b/web/public/id/faq/index.html @@ -206,7 +206,7 @@

              Pertanyaan yang sering diajukan

              Format apa yang akan hadir berikutnya?

              -

              7z, mp3, dan mp4. Saat ini 28 format bekerja dari ujung ke ujung.

              +

              7z dan mp3. Saat ini 29 format bekerja dari ujung ke ujung.

              @@ -277,7 +277,7 @@

              Pertanyaan yang sering diajukan

              { "@type": "Question", "name": "Format apa yang akan hadir berikutnya?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3, dan mp4. Saat ini 28 format bekerja dari ujung ke ujung." } + "acceptedAnswer": { "@type": "Answer", "text": "7z dan mp3. Saat ini 29 format bekerja dari ujung ke ujung." } }, { "@type": "Question", diff --git a/web/public/id/file-uji-rusak/index.html b/web/public/id/file-uji-rusak/index.html index 41a8702a..21881a89 100644 --- a/web/public/id/file-uji-rusak/index.html +++ b/web/public/id/file-uji-rusak/index.html @@ -201,7 +201,7 @@

              File yang rusak tetap berukuran seperti yang Anda minta

              tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

              Pengaturan ditulis setelah titik dua. Opsi ini bisa diulang, dan kerusakan diterapkan menurut urutan - yang Anda tulis. Berlaku untuk semua 28 format. + yang Anda tulis. Berlaku untuk semua 29 format.

              diff --git a/web/public/id/format/index.html b/web/public/id/format/index.html index 796c1951..7286f037 100644 --- a/web/public/id/format/index.html +++ b/web/public/id/format/index.html @@ -4,8 +4,8 @@ -28 Format File yang Didukung - PDF, DOCX, PNG, ZIP, dan Lainnya - +29 Format File yang Didukung - PDF, DOCX, PNG, ZIP, dan Lainnya + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
              -

              28 format file, masing-masing dibuat dengan ukuran tepat

              +

              29 format file, masing-masing dibuat dengan ukuran tepat

              Masing-masing adalah file asli dari format itu. File terbuka di aplikasi yang memilikinya dan persis berjumlah byte yang Anda minta. Tidak ada yang berupa nol pengisi dengan @@ -196,6 +196,14 @@

              28 format file, masing-masing dibuat dengan ukuran tepat

              full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

              Pengaturan yang diterima setiap format

              paragraphs 1 - 50000 paragraf + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 angka desimal + + + + altitude + benar atau salah + + + + vertices + 3 - 1000000 titik + + + + winding + reversed, rfc7946 + + + + antimeridian + benar atau salah + gif width diff --git a/web/public/id/index.html b/web/public/id/index.html index 630738ee..477163c4 100644 --- a/web/public/id/index.html +++ b/web/public/id/index.html @@ -4,7 +4,7 @@ -Generator File Uji untuk QA - Ukuran Tepat, 28 Format Asli +Generator File Uji untuk QA - Ukuran Tepat, 29 Format Asli @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Generator file uji untuk QA yang gratis dan open source. Alat ini membuat file asli dalam 28 format dengan ukuran tepat dan menulis manifes yang menyatakan bagaimana sistem yang diuji harus bereaksi terhadap tiap file.", + "description": "Generator file uji untuk QA yang gratis dan open source. Alat ini membuat file asli dalam 29 format dengan ukuran tepat dan menulis manifes yang menyatakan bagaimana sistem yang diuji harus bereaksi terhadap tiap file.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

              Buat file uji asli dengan ukuran tepat

              - PDF, PNG, DOCX, ZIP - 28 format seluruhnya, dan setiap file + PDF, PNG, DOCX, ZIP - 29 format seluruhnya, dan setiap file adalah file asli yang terbuka di aplikasi yang memilikinya, dengan ukuran persis seperti yang Anda minta. Setiap run juga mencatat apa yang harus dilakukan aplikasi Anda terhadap tiap file. Baris perintah dan jendela desktop, gratis dan open source, bekerja @@ -180,7 +180,7 @@

              Buat file uji asli dengan ukuran tepat

              • - 28 + 29

                format asli, masing-masing terbuka di aplikasi yang memilikinya

              • @@ -344,7 +344,7 @@

                Dibuat untuk suite yang berjalan tanpa pengawasan

                Minta 10485761 byte dan dapatkan persis itu. Ukuran yang tidak dapat dicapai format adalah galat dengan alasan, tidak pernah file berukuran salah.

              • -

                28 format asli

                +

                29 format asli

                Bukan nol pengisi dengan ekstensi. PNG yang dihasilkan terbuka di penampil gambar, DOCX terbuka di Word, ZIP bisa diekstrak. Masing-masing diperiksa dengan pembaca independen sebelum dirilis.

              • diff --git a/web/public/id/preset/empty-and-minimal/index.html b/web/public/id/preset/empty-and-minimal/index.html index 02fae09f..4e7adf9f 100644 --- a/web/public/id/preset/empty-and-minimal/index.html +++ b/web/public/id/preset/empty-and-minimal/index.html @@ -5,7 +5,7 @@ File Uji Valid Terkecil dan Kosong di Setiap Format - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

                Apa isi set?

                - - - - + + + +
                File30
                Target dalam resepnya30
                Ukuran total39 263 B
                Formatavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                File31
                Target dalam resepnya31
                Ukuran total40 138 B
                Formatavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                @@ -193,7 +193,7 @@

                Apa isi set?

                DiharapkanArtiFile - acceptSistem Anda harus menerima file ini.28 + acceptSistem Anda harus menerima file ini.29 unspecifiedTergantung pada aturan sistem Anda. Anda yang memutuskan, lalu memeriksa apakah yang terjadi sesuai maksud Anda.2 diff --git a/web/public/index.html b/web/public/index.html index a1d690af..1b52f100 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -4,7 +4,7 @@ -Test File Generator for QA - Exact Size, 28 Real Formats +Test File Generator for QA - Exact Size, 29 Real Formats @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "A free and open source generator of test files for QA. It produces real files of 28 formats at any exact size and writes a manifest saying how the system under test should react to each one.", + "description": "A free and open source generator of test files for QA. It produces real files of 29 formats at any exact size and writes a manifest saying how the system under test should react to each one.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                Generate real test files at any exact size

                - PDF, PNG, DOCX, ZIP - 28 formats in all, and every one is a + PDF, PNG, DOCX, ZIP - 29 formats in all, and every one is a real file that opens in the software that owns it, at exactly the size you asked for. Each run also writes down what your application is supposed to do with each file. Command line and desktop window, free and open source, working entirely on your machine. @@ -179,7 +179,7 @@

                Generate real test files at any exact size

                • - 28 + 29

                  real formats, each one opening in the software that owns it

                • @@ -342,7 +342,7 @@

                  Built for a suite that runs unattended

                  Ask for 10485761 bytes and get exactly that. A size a format cannot reach is an error with a reason, never a file of the wrong size.

                • -

                  28 real formats

                  +

                  29 real formats

                  Not padded zeros with an extension. A generated PNG opens in an image viewer, a DOCX opens in Word, a ZIP extracts. Each one is checked against independent readers before it ships.

                • diff --git a/web/public/it/domande-frequenti/index.html b/web/public/it/domande-frequenti/index.html index a39c55e2..66937cda 100644 --- a/web/public/it/domande-frequenti/index.html +++ b/web/public/it/domande-frequenti/index.html @@ -206,7 +206,7 @@

                  Domande frequenti

                  Quali formati arrivano dopo?

                  -

                  7z, mp3 e mp4. Oggi 28 formati funzionano da un capo all'altro.

                  +

                  7z e mp3. Oggi 29 formati funzionano da un capo all'altro.

                  @@ -277,7 +277,7 @@

                  Domande frequenti

                  { "@type": "Question", "name": "Quali formati arrivano dopo?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 e mp4. Oggi 28 formati funzionano da un capo all\u0027altro." } + "acceptedAnswer": { "@type": "Answer", "text": "7z e mp3. Oggi 29 formati funzionano da un capo all\u0027altro." } }, { "@type": "Question", diff --git a/web/public/it/file-di-test-corrotti/index.html b/web/public/it/file-di-test-corrotti/index.html index 73f35a32..780860bc 100644 --- a/web/public/it/file-di-test-corrotti/index.html +++ b/web/public/it/file-di-test-corrotti/index.html @@ -201,7 +201,7 @@

                  Un file danneggiato ha ancora la dimensione richiesta

                  tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                  Le impostazioni vanno dopo i due punti. L'opzione si può ripetere, e i danni vengono applicati - nell'ordine in cui li scrivi. Funziona con ognuno dei 28 formati. + nell'ordine in cui li scrivi. Funziona con ognuno dei 29 formati.

                  diff --git a/web/public/it/formati/index.html b/web/public/it/formati/index.html index b183deaa..488c2eb3 100644 --- a/web/public/it/formati/index.html +++ b/web/public/it/formati/index.html @@ -4,8 +4,8 @@ -28 formati di file supportati - PDF, DOCX, PNG, ZIP e altri - +29 formati di file supportati - PDF, DOCX, PNG, ZIP e altri + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                  -

                  28 formati di file, ognuno generato a una dimensione esatta

                  +

                  29 formati di file, ognuno generato a una dimensione esatta

                  Ognuno è un file reale di quel formato. Si apre nel programma che gli appartiene ed è esattamente il numero di byte che hai chiesto. Nessuno è riempimento di zeri con un'estensione @@ -196,6 +196,14 @@

                  28 formati di file, ognuno generato a una dimensione esatta

                  full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -499,6 +507,41 @@

                  Impostazioni che ogni formato accetta

                  paragraphs 1 - 50000 paragrafi + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 cifre decimali + + + + altitude + vero o falso + + + + vertices + 3 - 1000000 punti + + + + winding + reversed, rfc7946 + + + + antimeridian + vero o falso + gif width diff --git a/web/public/it/index.html b/web/public/it/index.html index 29124e9b..39959dc0 100644 --- a/web/public/it/index.html +++ b/web/public/it/index.html @@ -4,7 +4,7 @@ -Generatore di file di test - dimensione esatta, 28 formati reali +Generatore di file di test - dimensione esatta, 29 formati reali @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Un generatore gratuito e open source di file di test per la QA. Produce file reali in 28 formati della dimensione esatta e scrive un manifest che dice come il sistema sotto test deve reagire a ciascuno.", + "description": "Un generatore gratuito e open source di file di test per la QA. Produce file reali in 29 formati della dimensione esatta e scrive un manifest che dice come il sistema sotto test deve reagire a ciascuno.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                  Genera file di test reali della dimensione esatta

                  - PDF, PNG, DOCX, ZIP - 28 formati in tutto, e ognuno è un file + PDF, PNG, DOCX, ZIP - 29 formati in tutto, e ognuno è un file reale che si apre nel programma che gli appartiene, di esattamente la dimensione che hai chiesto. Ogni esecuzione annota anche cosa la tua applicazione deve fare con ogni file. Riga di comando e finestra desktop, gratuito e open source, interamente sulla tua macchina. @@ -179,7 +179,7 @@

                  Genera file di test reali della dimensione esatta

                  • - 28 + 29

                    formati reali, ognuno si apre nel programma che gli appartiene

                  • @@ -344,7 +344,7 @@

                    Costruito per una suite che gira senza supervisione

                    Chiedi 10485761 byte e ottieni esattamente quelli. Una dimensione che un formato non può raggiungere è un errore con un motivo, mai un file della dimensione sbagliata.

                  • -

                    28 formati reali

                    +

                    29 formati reali

                    Non zeri di riempimento con un'estensione. Un PNG generato si apre in un visualizzatore di immagini, un DOCX si apre in Word, uno ZIP si estrae. Ognuno è verificato con lettori indipendenti prima del rilascio.

                  • diff --git a/web/public/it/preset/empty-and-minimal/index.html b/web/public/it/preset/empty-and-minimal/index.html index 40d49f4e..08b9eba7 100644 --- a/web/public/it/preset/empty-and-minimal/index.html +++ b/web/public/it/preset/empty-and-minimal/index.html @@ -5,7 +5,7 @@ File di test validi minimi e vuoti in ogni formato - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

                    Cosa c'è nel set?

                    - - - - + + + +
                    File30
                    Target nella sua ricetta30
                    Dimensione totale39 263 B
                    Formatiavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                    File31
                    Target nella sua ricetta31
                    Dimensione totale40 138 B
                    Formatiavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                    @@ -193,7 +193,7 @@

                    Cosa c'è nel set?

                    AttesoSignificatoFile - acceptIl tuo sistema deve accettare il file.28 + acceptIl tuo sistema deve accettare il file.29 unspecifiedDipende dalle regole del tuo sistema. Decidi tu, poi controlli che ciò che accade sia ciò che intendevi.2 diff --git a/web/public/ja/corrupt-test-files/index.html b/web/public/ja/corrupt-test-files/index.html index 147901ac..8d70345f 100644 --- a/web/public/ja/corrupt-test-files/index.html +++ b/web/public/ja/corrupt-test-files/index.html @@ -189,7 +189,7 @@

                    破損したファイルも、求めたサイズのままです

                    tfg generate --format png --size 2mb --damage zero-head --out ./out
                     tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                    - 設定はコロンの後ろに書きます。オプションは繰り返せて、破損は書いた順に適用されます。28種類すべての形式で使えます。 + 設定はコロンの後ろに書きます。オプションは繰り返せて、破損は書いた順に適用されます。29種類すべての形式で使えます。

                    diff --git a/web/public/ja/faq/index.html b/web/public/ja/faq/index.html index 021066ad..fa20a071 100644 --- a/web/public/ja/faq/index.html +++ b/web/public/ja/faq/index.html @@ -204,7 +204,7 @@

                    よくある質問

                    次に対応する形式は何ですか。

                    -

                    7z、mp3、mp4です。現在、28種類の形式がエンドツーエンドで動作します。

                    +

                    7zとmp3です。現在、29種類の形式がエンドツーエンドで動作します。

                    @@ -275,7 +275,7 @@

                    よくある質問

                    { "@type": "Question", "name": "次に対応する形式は何ですか。", - "acceptedAnswer": { "@type": "Answer", "text": "7z、mp3、mp4です。現在、28種類の形式がエンドツーエンドで動作します。" } + "acceptedAnswer": { "@type": "Answer", "text": "7zとmp3です。現在、29種類の形式がエンドツーエンドで動作します。" } }, { "@type": "Question", diff --git a/web/public/ja/formats/index.html b/web/public/ja/formats/index.html index dc7aa39e..869d5efa 100644 --- a/web/public/ja/formats/index.html +++ b/web/public/ja/formats/index.html @@ -4,8 +4,8 @@ -対応する28種類のファイル形式 - PDF、DOCX、PNG、ZIPほか - +対応する29種類のファイル形式 - PDF、DOCX、PNG、ZIPほか + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                    -

                    28種類のファイル形式、どれも正確なサイズで生成

                    +

                    29種類のファイル形式、どれも正確なサイズで生成

                    どれもその形式の本物のファイルです。対応するソフトウェアで開け、要求したバイト数とぴったり一致します。拡張子を貼り付けただけのゼロ埋めはひとつもありません。

                    @@ -194,6 +194,14 @@

                    28種類のファイル形式、どれも正確なサイズで生成

                    full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -489,6 +497,41 @@

                    形式ごとに受け付ける設定

                    paragraphs 1 - 50000 段落 + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 小数桁 + + + + altitude + 真または偽 + + + + vertices + 3 - 1000000 点 + + + + winding + reversed, rfc7946 + + + + antimeridian + 真または偽 + gif width diff --git a/web/public/ja/index.html b/web/public/ja/index.html index 1fdd6248..52f526a6 100644 --- a/web/public/ja/index.html +++ b/web/public/ja/index.html @@ -4,7 +4,7 @@ -テストファイル生成ツール - 正確なサイズ、28種類の本物の形式 +テストファイル生成ツール - 正確なサイズ、29種類の本物の形式 @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "QA向けの無料オープンソースのテストファイル生成ツールです。28種類の形式で正確なサイズの本物のファイルを作り、テスト対象のシステムが各ファイルにどう反応すべきかを示すマニフェストを書き出します。", + "description": "QA向けの無料オープンソースのテストファイル生成ツールです。29種類の形式で正確なサイズの本物のファイルを作り、テスト対象のシステムが各ファイルにどう反応すべきかを示すマニフェストを書き出します。", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                    正確なサイズの本物のテストファイルを生成

                    - PDF、PNG、DOCX、ZIPなど、全28種類の形式に対応し、どれも対応するソフトウェアで開ける本物のファイルで、サイズは要求したとおりちょうどです。各実行では、アプリが各ファイルをどう扱うべきかも書き出します。コマンドラインとデスクトップウィンドウの両方に対応し、無料のオープンソースで、すべてあなたのマシン上で動きます。 + PDF、PNG、DOCX、ZIPなど、全29種類の形式に対応し、どれも対応するソフトウェアで開ける本物のファイルで、サイズは要求したとおりちょうどです。各実行では、アプリが各ファイルをどう扱うべきかも書き出します。コマンドラインとデスクトップウィンドウの両方に対応し、無料のオープンソースで、すべてあなたのマシン上で動きます。

                    @@ -176,7 +176,7 @@

                    正確なサイズの本物のテストファイルを生成

                    • - 28 + 29

                      種類の本物の形式、どれも対応するソフトウェアで開けます

                    • @@ -328,7 +328,7 @@

                      無人で動くテストスイートのために作られています

                      10485761バイトを要求すれば、ちょうどその大きさになります。形式が到達できないサイズは理由付きのエラーになり、サイズの違うファイルが作られることはありません。

                    • -

                      28種類の本物の形式

                      +

                      29種類の本物の形式

                      拡張子を付けただけのゼロ埋めではありません。生成したPNGは画像ビューアーで開け、DOCXはWordで開け、ZIPは展開できます。どれも出荷前に独立したリーダーで検証されます。

                    • diff --git a/web/public/ja/presets/empty-and-minimal/index.html b/web/public/ja/presets/empty-and-minimal/index.html index ed7af275..a512efcb 100644 --- a/web/public/ja/presets/empty-and-minimal/index.html +++ b/web/public/ja/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ 全形式の最小の有効ファイルと空ファイル - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -176,10 +176,10 @@

                      セットには何が入っていますか。

                      - - - - + + + +
                      ファイル数30
                      レシピ内のターゲット数30
                      合計サイズ39 263 B
                      形式avif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                      ファイル数31
                      レシピ内のターゲット数31
                      合計サイズ40 138 B
                      形式avif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                      @@ -190,7 +190,7 @@

                      セットには何が入っていますか。

                      期待意味ファイル数 - acceptシステムはこのファイルを受け入れるべきです。28 + acceptシステムはこのファイルを受け入れるべきです。29 unspecifiedシステムのルール次第です。あなたが決め、実際に起きることが意図どおりかを確認してください。2 diff --git a/web/public/ko/corrupt-test-files/index.html b/web/public/ko/corrupt-test-files/index.html index cefdecf0..a882992b 100644 --- a/web/public/ko/corrupt-test-files/index.html +++ b/web/public/ko/corrupt-test-files/index.html @@ -194,7 +194,7 @@

                      손상된 파일도 요청한 크기를 유지합니다

                      tfg generate --format png --size 2mb --damage zero-head --out ./out
                       tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                      - 설정은 콜론 뒤에 씁니다. 옵션은 반복할 수 있고, 손상은 쓴 순서대로 적용됩니다. 28개 형식 모두에서 동작합니다. + 설정은 콜론 뒤에 씁니다. 옵션은 반복할 수 있고, 손상은 쓴 순서대로 적용됩니다. 29개 형식 모두에서 동작합니다.

                      diff --git a/web/public/ko/faq/index.html b/web/public/ko/faq/index.html index 3898d959..05e18003 100644 --- a/web/public/ko/faq/index.html +++ b/web/public/ko/faq/index.html @@ -205,7 +205,7 @@

                      자주 묻는 질문

                      다음에는 어떤 형식이 추가되나요?

                      -

                      7z, mp3, mp4입니다. 현재 28가지 형식이 처음부터 끝까지 동작합니다.

                      +

                      7z와 mp3입니다. 현재 29가지 형식이 처음부터 끝까지 동작합니다.

                      @@ -276,7 +276,7 @@

                      자주 묻는 질문

                      { "@type": "Question", "name": "다음에는 어떤 형식이 추가되나요?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3, mp4입니다. 현재 28가지 형식이 처음부터 끝까지 동작합니다." } + "acceptedAnswer": { "@type": "Answer", "text": "7z와 mp3입니다. 현재 29가지 형식이 처음부터 끝까지 동작합니다." } }, { "@type": "Question", diff --git a/web/public/ko/formats/index.html b/web/public/ko/formats/index.html index ad6a1a71..06971acb 100644 --- a/web/public/ko/formats/index.html +++ b/web/public/ko/formats/index.html @@ -4,8 +4,8 @@ -지원하는 파일 형식 28종 - PDF, DOCX, PNG, ZIP 등 - +지원하는 파일 형식 29종 - PDF, DOCX, PNG, ZIP 등 + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                      -

                      파일 형식 28가지, 모두 정확한 크기로 생성됩니다

                      +

                      파일 형식 29가지, 모두 정확한 크기로 생성됩니다

                      이들은 모두 해당 형식의 실제 파일입니다. 해당 소프트웨어에서 열리며 요청한 바이트 수와 정확히 같습니다. 확장자만 붙인 채운 0은 하나도 없습니다.

                      @@ -194,6 +194,14 @@

                      파일 형식 28가지, 모두 정확한 크기로 생성됩니다

                      full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -490,6 +498,41 @@

                      각 형식이 받는 설정

                      paragraphs 1 - 50000 단락 + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 소수 자릿수 + + + + altitude + 참 또는 거짓 + + + + vertices + 3 - 1000000 점 + + + + winding + reversed, rfc7946 + + + + antimeridian + 참 또는 거짓 + gif width diff --git a/web/public/ko/index.html b/web/public/ko/index.html index 1e72225e..d2b1f230 100644 --- a/web/public/ko/index.html +++ b/web/public/ko/index.html @@ -4,7 +4,7 @@ -테스트 파일 생성기 - 정확한 크기, 실제 형식 28종 +테스트 파일 생성기 - 정확한 크기, 실제 형식 29종 @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "QA를 위한 무료 오픈 소스 테스트 파일 생성기입니다. 28가지 형식의 정확한 크기의 실제 파일을 만들고, 테스트 대상 시스템이 각 파일에 어떻게 반응해야 하는지 알려 주는 매니페스트를 작성합니다.", + "description": "QA를 위한 무료 오픈 소스 테스트 파일 생성기입니다. 29가지 형식의 정확한 크기의 실제 파일을 만들고, 테스트 대상 시스템이 각 파일에 어떻게 반응해야 하는지 알려 주는 매니페스트를 작성합니다.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                      정확한 크기의 실제 테스트 파일을 만드세요

                      - PDF, PNG, DOCX, ZIP 등 모두 28가지 형식이며, 모두 해당 소프트웨어에서 열리는 실제 파일로 + PDF, PNG, DOCX, ZIP 등 모두 29가지 형식이며, 모두 해당 소프트웨어에서 열리는 실제 파일로 요청한 크기와 정확히 같습니다. 매 실행마다 애플리케이션이 각 파일을 어떻게 처리해야 하는지도 함께 기록합니다. 명령줄과 데스크톱 창, 무료 오픈 소스이며, 모두 여러분의 컴퓨터에서 동작합니다.

                      @@ -178,7 +178,7 @@

                      정확한 크기의 실제 테스트 파일을 만드세요

                      • - 28 + 29

                        가지 실제 형식, 각각 해당 소프트웨어에서 열립니다

                      • @@ -335,7 +335,7 @@

                        무인으로 실행되는 테스트 묶음을 위해 만들었습니다

                        10485761바이트를 요청하면 정확히 그 크기가 나옵니다. 형식이 도달할 수 없는 크기는 이유가 붙은 오류가 되며, 크기가 틀린 파일이 되는 일은 없습니다.

                      • -

                        실제 형식 28가지

                        +

                        실제 형식 29가지

                        확장자만 붙인 채운 0이 아닙니다. 생성된 PNG는 이미지 뷰어에서 열리고, DOCX는 Word에서 열리며, ZIP은 풀립니다. 모든 형식은 출시 전에 독립적인 리더로 검증됩니다.

                      • diff --git a/web/public/ko/presets/empty-and-minimal/index.html b/web/public/ko/presets/empty-and-minimal/index.html index 0e8310cc..33ebd247 100644 --- a/web/public/ko/presets/empty-and-minimal/index.html +++ b/web/public/ko/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ 모든 형식의 가장 작은 유효 파일과 빈 파일 - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -177,10 +177,10 @@

                        세트에는 무엇이 들어 있나요?

                        - - - - + + + +
                        파일 수30
                        레시피의 타깃 수30
                        총 크기39 263 B
                        형식avif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                        파일 수31
                        레시피의 타깃 수31
                        총 크기40 138 B
                        형식avif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                        @@ -191,7 +191,7 @@

                        세트에는 무엇이 들어 있나요?

                        기대값의미파일 수 - accept시스템은 이 파일을 받아야 합니다.28 + accept시스템은 이 파일을 받아야 합니다.29 unspecified시스템의 규칙에 따라 다릅니다. 직접 결정한 뒤 실제 일어나는 일이 의도한 것인지 확인하세요.2 diff --git a/web/public/nl/beschadigde-testbestanden/index.html b/web/public/nl/beschadigde-testbestanden/index.html index 774a3f3a..8add9068 100644 --- a/web/public/nl/beschadigde-testbestanden/index.html +++ b/web/public/nl/beschadigde-testbestanden/index.html @@ -203,7 +203,7 @@

                        Een beschadigd bestand heeft nog steeds de grootte die je vroeg

                        Instellingen komen achter een dubbele punt. De optie mag herhaald worden, en de beschadigingen worden toegepast in de volgorde waarin je ze schrijft. Het werkt met elk van de - 28 formaten. + 29 formaten.

                        diff --git a/web/public/nl/formaten/index.html b/web/public/nl/formaten/index.html index 6b0cdbd9..18a9206d 100644 --- a/web/public/nl/formaten/index.html +++ b/web/public/nl/formaten/index.html @@ -4,8 +4,8 @@ -28 ondersteunde bestandsformaten - PDF, DOCX, PNG, ZIP en meer - +29 ondersteunde bestandsformaten - PDF, DOCX, PNG, ZIP en meer + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                        -

                        28 bestandsformaten, elk gegenereerd in een exacte grootte

                        +

                        29 bestandsformaten, elk gegenereerd in een exacte grootte

                        Elk daarvan is een echt bestand van dat formaat. Het opent in het programma waartoe het behoort en is precies het aantal bytes dat je vroeg. Geen enkele is opgevulde nullen met een @@ -196,6 +196,14 @@

                        28 bestandsformaten, elk gegenereerd in een exacte grootte

                        full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -499,6 +507,41 @@

                        Instellingen die elk formaat accepteert

                        paragraphs 1 - 50000 alinea's + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 decimalen + + + + altitude + waar of onwaar + + + + vertices + 3 - 1000000 punten + + + + winding + reversed, rfc7946 + + + + antimeridian + waar of onwaar + gif width diff --git a/web/public/nl/index.html b/web/public/nl/index.html index a23f1526..f81de301 100644 --- a/web/public/nl/index.html +++ b/web/public/nl/index.html @@ -4,7 +4,7 @@ -Testbestanden genereren - exacte grootte, 28 echte formaten +Testbestanden genereren - exacte grootte, 29 echte formaten @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Een gratis open source generator van testbestanden voor QA. Hij maakt echte bestanden in 28 formaten in elke exacte grootte en schrijft een manifest dat zegt hoe het geteste systeem op elk bestand moet reageren.", + "description": "Een gratis open source generator van testbestanden voor QA. Hij maakt echte bestanden in 29 formaten in elke exacte grootte en schrijft een manifest dat zegt hoe het geteste systeem op elk bestand moet reageren.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                        Genereer echte testbestanden in elke exacte grootte

                        - PDF, PNG, DOCX, ZIP - 28 formaten in totaal, en elk is een + PDF, PNG, DOCX, ZIP - 29 formaten in totaal, en elk is een echt bestand dat opent in het programma waartoe het behoort, in precies de grootte die je vroeg. Elke run schrijft ook op wat je applicatie met elk bestand moet doen. Opdrachtregel en bureaubladvenster, gratis en open source, volledig op je eigen machine. @@ -179,7 +179,7 @@

                        Genereer echte testbestanden in elke exacte grootte

                        • - 28 + 29

                          echte formaten, elk opent in het programma waartoe het behoort

                        • @@ -342,7 +342,7 @@

                          Gebouwd voor een suite die onbeheerd draait

                          Vraag 10485761 bytes en krijg precies dat. Een grootte die een formaat niet kan halen is een fout met een reden, nooit een bestand van de verkeerde grootte.

                        • -

                          28 echte formaten

                          +

                          29 echte formaten

                          Geen opgevulde nullen met een extensie. Een gegenereerde PNG opent in een afbeeldingsviewer, een DOCX opent in Word, een ZIP pakt uit. Elk wordt vóór levering gecontroleerd met onafhankelijke lezers.

                        • diff --git a/web/public/nl/presets/empty-and-minimal/index.html b/web/public/nl/presets/empty-and-minimal/index.html index 7a58aaab..a544f729 100644 --- a/web/public/nl/presets/empty-and-minimal/index.html +++ b/web/public/nl/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Kleinste geldige en lege testbestanden in elk formaat - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

                          Wat zit er in de set?

                          - - - - + + + +
                          Bestanden30
                          Targets in het recept30
                          Totale grootte39 263 B
                          Formatenavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                          Bestanden31
                          Targets in het recept31
                          Totale grootte40 138 B
                          Formatenavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                          @@ -193,7 +193,7 @@

                          Wat zit er in de set?

                          VerwachtBetekenisBestanden - acceptJe systeem moet het bestand aannemen.28 + acceptJe systeem moet het bestand aannemen.29 unspecifiedHet hangt af van de regels van je systeem. Jij beslist, en controleert daarna of wat er gebeurt is wat je bedoelde.2 diff --git a/web/public/nl/veelgestelde-vragen/index.html b/web/public/nl/veelgestelde-vragen/index.html index 7d240c3c..5041deaa 100644 --- a/web/public/nl/veelgestelde-vragen/index.html +++ b/web/public/nl/veelgestelde-vragen/index.html @@ -206,7 +206,7 @@

                          Veelgestelde vragen

                          Welke formaten komen er nog?

                          -

                          7z, mp3 en mp4. Vandaag werken 28 formaten van begin tot eind.

                          +

                          7z en mp3. Vandaag werken 29 formaten van begin tot eind.

                          @@ -277,7 +277,7 @@

                          Veelgestelde vragen

                          { "@type": "Question", "name": "Welke formaten komen er nog?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 en mp4. Vandaag werken 28 formaten van begin tot eind." } + "acceptedAnswer": { "@type": "Answer", "text": "7z en mp3. Vandaag werken 29 formaten van begin tot eind." } }, { "@type": "Question", diff --git a/web/public/pl/faq/index.html b/web/public/pl/faq/index.html index f8525c0f..b8e6f72b 100644 --- a/web/public/pl/faq/index.html +++ b/web/public/pl/faq/index.html @@ -206,7 +206,7 @@

                          Najczęstsze pytania

                          Jakie formaty są następne w kolejce?

                          -

                          7z, mp3 i mp4. Formatów działających dziś od początku do końca jest 28.

                          +

                          7z i mp3. Formatów działających dziś od początku do końca jest 29.

                          @@ -277,7 +277,7 @@

                          Najczęstsze pytania

                          { "@type": "Question", "name": "Jakie formaty są następne w kolejce?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 i mp4. Formatów działających dziś od początku do końca jest 28." } + "acceptedAnswer": { "@type": "Answer", "text": "7z i mp3. Formatów działających dziś od początku do końca jest 29." } }, { "@type": "Question", diff --git a/web/public/pl/formaty/index.html b/web/public/pl/formaty/index.html index 5da85b48..ee05b47d 100644 --- a/web/public/pl/formaty/index.html +++ b/web/public/pl/formaty/index.html @@ -4,7 +4,7 @@ -28 formatów plików testowych - PDF, DOCX, PNG, ZIP +29 formatów plików testowych - PDF, DOCX, PNG, ZIP @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -144,7 +144,7 @@
                          -

                          28 formatów plików, każdy generowany o dokładnym rozmiarze

                          +

                          29 formatów plików, każdy generowany o dokładnym rozmiarze

                          Każdy z nich to prawdziwy plik tego formatu. Otwiera się w programie, do którego należy, i ma dokładnie tyle bajtów, ile zamówiłeś. Żaden nie jest zerami z doklejonym rozszerzeniem. @@ -195,6 +195,14 @@

                          28 formatów plików, każdy generowany o dokładnym rozmiarze

                          full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

                          Ustawienia, które przyjmuje każdy format

                          paragraphs 1 - 50000 akapitów + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 miejsc po przecinku + + + + altitude + prawda albo fałsz + + + + vertices + 3 - 1000000 punktów + + + + winding + reversed, rfc7946 + + + + antimeridian + prawda albo fałsz + gif width diff --git a/web/public/pl/index.html b/web/public/pl/index.html index 203412ae..a3643eb0 100644 --- a/web/public/pl/index.html +++ b/web/public/pl/index.html @@ -4,7 +4,7 @@ -Generator plików testowych o zadanym rozmiarze - 28 formatów +Generator plików testowych o zadanym rozmiarze - 29 formatów @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Darmowy generator plików testowych dla QA o otwartym kodzie. Tworzy prawdziwe pliki w 28 formatach o dokładnie zadanym rozmiarze i zapisuje manifest mówiący, jak testowany system ma na każdy z nich zareagować.", + "description": "Darmowy generator plików testowych dla QA o otwartym kodzie. Tworzy prawdziwe pliki w 29 formatach o dokładnie zadanym rozmiarze i zapisuje manifest mówiący, jak testowany system ma na każdy z nich zareagować.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                          Generuj pliki testowe o zadanym rozmiarze

                          - PDF, PNG, DOCX, ZIP - razem 28 formatów, a każdy to + PDF, PNG, DOCX, ZIP - razem 29 formatów, a każdy to prawdziwy plik, który otwiera się w programie, do którego należy, i ma dokładnie taki rozmiar, o jaki poprosisz. Każdy przebieg zapisuje też, co Twoja aplikacja ma z każdym plikiem zrobić. Wiersz poleceń i okno, darmowe i otwarte, działające wyłącznie na Twojej maszynie. @@ -179,7 +179,7 @@

                          Generuj pliki testowe o zadanym rozmiarze

                          • - 28 + 29

                            prawdziwych formatów, każdy otwiera się w programie, do którego należy

                          • @@ -342,7 +342,7 @@

                            Zbudowane pod zestaw, który chodzi bez nadzoru

                            Poproś o 10485761 bajtów i tyle dostaniesz. Rozmiar nieosiągalny dla formatu to błąd z powodem, nigdy plik o innym rozmiarze.

                          • -

                            28 prawdziwych formatów

                            +

                            29 prawdziwych formatów

                            Nie zera z doklejonym rozszerzeniem. Wygenerowany PNG otwiera się w przeglądarce obrazów, DOCX w Wordzie, a ZIP się rozpakowuje. Każdy format jest sprawdzany niezależnym czytnikiem, zanim trafi do wydania.

                          • diff --git a/web/public/pl/presety/empty-and-minimal/index.html b/web/public/pl/presety/empty-and-minimal/index.html index 36da45e1..a79fd946 100644 --- a/web/public/pl/presety/empty-and-minimal/index.html +++ b/web/public/pl/presety/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Najmniejsze poprawne i puste pliki w każdym formacie - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                            Co jest w zestawie?

                            - - - - + + + +
                            Pliki30
                            Cele w przepisie30
                            Łączny rozmiar39 263 B
                            Formatyavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                            Pliki31
                            Cele w przepisie31
                            Łączny rozmiar40 138 B
                            Formatyavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                            @@ -192,7 +192,7 @@

                            Co jest w zestawie?

                            OczekiwanieZnaczeniePliki - acceptSystem powinien przyjąć plik.28 + acceptSystem powinien przyjąć plik.29 unspecifiedZależy od reguł Twojego systemu. Ty decydujesz, a potem sprawdzasz, czy dzieje się to, co zamierzałeś.2 diff --git a/web/public/pl/uszkodzone-pliki-testowe/index.html b/web/public/pl/uszkodzone-pliki-testowe/index.html index 28601dc4..22658b43 100644 --- a/web/public/pl/uszkodzone-pliki-testowe/index.html +++ b/web/public/pl/uszkodzone-pliki-testowe/index.html @@ -202,7 +202,7 @@

                            Uszkodzony plik ma nadal rozmiar, o który prosiłeś

                            tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                            Ustawienia podaje się po dwukropku. Flagę można powtarzać, a uszkodzenia są stosowane w kolejności, - w jakiej je zapiszesz. Działa z każdym z 28 formatów. + w jakiej je zapiszesz. Działa z każdym z 29 formatów.

                            diff --git a/web/public/presets/empty-and-minimal/index.html b/web/public/presets/empty-and-minimal/index.html index b21c70a9..b1d79514 100644 --- a/web/public/presets/empty-and-minimal/index.html +++ b/web/public/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Smallest Valid and Empty Test Files in Every Format - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                            What is in the set?

                            - - - - + + + +
                            Files30
                            Targets in its recipe30
                            Total size39 263 B
                            Formatsavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                            Files31
                            Targets in its recipe31
                            Total size40 138 B
                            Formatsavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                            @@ -192,7 +192,7 @@

                            What is in the set?

                            ExpectedMeaningFiles - acceptYour system should take the file.28 + acceptYour system should take the file.29 unspecifiedIt depends on the rules of your system. You decide, then check that what happens is what you meant.2 diff --git a/web/public/pt-br/arquivos-de-teste-corrompidos/index.html b/web/public/pt-br/arquivos-de-teste-corrompidos/index.html index 67e3b379..32d9fdd5 100644 --- a/web/public/pt-br/arquivos-de-teste-corrompidos/index.html +++ b/web/public/pt-br/arquivos-de-teste-corrompidos/index.html @@ -201,7 +201,7 @@

                            Um arquivo danificado continua com o tamanho que você pediu

                            tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                            As configurações vão depois de dois-pontos. A opção pode ser repetida, e os danos são aplicados na - ordem em que você os escreve. Funciona com cada um dos 28 formatos. + ordem em que você os escreve. Funciona com cada um dos 29 formatos.

                            diff --git a/web/public/pt-br/formatos/index.html b/web/public/pt-br/formatos/index.html index 935748b7..ce0a5973 100644 --- a/web/public/pt-br/formatos/index.html +++ b/web/public/pt-br/formatos/index.html @@ -4,8 +4,8 @@ -28 formatos de arquivo - PDF, DOCX, PNG, ZIP e mais - +29 formatos de arquivo - PDF, DOCX, PNG, ZIP e mais + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                            -

                            28 formatos de arquivo, cada um gerado em um tamanho exato

                            +

                            29 formatos de arquivo, cada um gerado em um tamanho exato

                            Cada um é um arquivo real daquele formato. Abre no programa a que pertence e tem exatamente o número de bytes que você pediu. Nenhum é preenchimento de zeros com uma extensão @@ -196,6 +196,14 @@

                            28 formatos de arquivo, cada um gerado em um tamanho exato

                            full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -498,6 +506,41 @@

                            Configurações que cada formato aceita

                            paragraphs 1 - 50000 parágrafos + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 casas decimais + + + + altitude + verdadeiro ou falso + + + + vertices + 3 - 1000000 pontos + + + + winding + reversed, rfc7946 + + + + antimeridian + verdadeiro ou falso + gif width diff --git a/web/public/pt-br/index.html b/web/public/pt-br/index.html index 9f4a515e..f80813fa 100644 --- a/web/public/pt-br/index.html +++ b/web/public/pt-br/index.html @@ -4,7 +4,7 @@ -Gerador de arquivos de teste - tamanho exato, 28 formatos reais +Gerador de arquivos de teste - tamanho exato, 29 formatos reais @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Um gerador gratuito e de código aberto de arquivos de teste para QA. Produz arquivos reais de 28 formatos no tamanho exato e escreve um manifesto que diz como o sistema sob teste deve reagir a cada um.", + "description": "Um gerador gratuito e de código aberto de arquivos de teste para QA. Produz arquivos reais de 29 formatos no tamanho exato e escreve um manifesto que diz como o sistema sob teste deve reagir a cada um.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                            Gere arquivos de teste reais no tamanho exato

                            - PDF, PNG, DOCX, ZIP - 28 formatos no total, e cada um é um + PDF, PNG, DOCX, ZIP - 29 formatos no total, e cada um é um arquivo real que abre no programa a que pertence, com exatamente o tamanho que você pediu. Cada execução também registra o que sua aplicação deve fazer com cada arquivo. Linha de comando e janela de desktop, gratuito e de código aberto, funcionando inteiramente na @@ -180,7 +180,7 @@

                            Gere arquivos de teste reais no tamanho exato

                            • - 28 + 29

                              formatos reais, cada um abre no programa a que pertence

                            • @@ -345,7 +345,7 @@

                              Feito para uma suíte que roda sem supervisão

                              Peça 10485761 bytes e receba exatamente isso. Um tamanho que um formato não alcança é um erro com um motivo, nunca um arquivo de tamanho errado.

                            • -

                              28 formatos reais

                              +

                              29 formatos reais

                              Não são zeros de preenchimento com uma extensão. Um PNG gerado abre em um visualizador de imagens, um DOCX abre no Word, um ZIP extrai. Cada um é verificado com leitores independentes antes de ser liberado.

                            • diff --git a/web/public/pt-br/perguntas-frequentes/index.html b/web/public/pt-br/perguntas-frequentes/index.html index 0b443d1a..ef40134a 100644 --- a/web/public/pt-br/perguntas-frequentes/index.html +++ b/web/public/pt-br/perguntas-frequentes/index.html @@ -206,7 +206,7 @@

                              Perguntas frequentes

                              Quais formatos vêm a seguir?

                              -

                              7z, mp3 e mp4. Hoje 28 formatos funcionam de ponta a ponta.

                              +

                              7z e mp3. Hoje 29 formatos funcionam de ponta a ponta.

                              @@ -277,7 +277,7 @@

                              Perguntas frequentes

                              { "@type": "Question", "name": "Quais formatos vêm a seguir?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 e mp4. Hoje 28 formatos funcionam de ponta a ponta." } + "acceptedAnswer": { "@type": "Answer", "text": "7z e mp3. Hoje 29 formatos funcionam de ponta a ponta." } }, { "@type": "Question", diff --git a/web/public/pt-br/presets/empty-and-minimal/index.html b/web/public/pt-br/presets/empty-and-minimal/index.html index 1b8e1918..f42a8527 100644 --- a/web/public/pt-br/presets/empty-and-minimal/index.html +++ b/web/public/pt-br/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Menores arquivos de teste válidos e vazios em cada formato - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                              O que há no conjunto?

                              - - - - + + + +
                              Arquivos30
                              Targets na sua receita30
                              Tamanho total39 263 B
                              Formatosavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                              Arquivos31
                              Targets na sua receita31
                              Tamanho total40 138 B
                              Formatosavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                              @@ -192,7 +192,7 @@

                              O que há no conjunto?

                              EsperadoSignificadoArquivos - acceptSeu sistema deve aceitar o arquivo.28 + acceptSeu sistema deve aceitar o arquivo.29 unspecifiedDepende das regras do seu sistema. Você decide e depois confere se o que acontece é o que você queria.2 diff --git a/web/public/ro/fisiere-de-test-corupte/index.html b/web/public/ro/fisiere-de-test-corupte/index.html index ee9e7c68..ba1c5f4e 100644 --- a/web/public/ro/fisiere-de-test-corupte/index.html +++ b/web/public/ro/fisiere-de-test-corupte/index.html @@ -202,7 +202,7 @@

                              Un fișier deteriorat are în continuare mărimea cerută

                              tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                              Setările se scriu după două puncte. Opțiunea poate fi repetată, iar deteriorările se aplică în - ordinea în care le scrii. Funcționează cu fiecare dintre cele 28 formate. + ordinea în care le scrii. Funcționează cu fiecare dintre cele 29 formate.

                              diff --git a/web/public/ro/formate/index.html b/web/public/ro/formate/index.html index f324c679..d3718f4c 100644 --- a/web/public/ro/formate/index.html +++ b/web/public/ro/formate/index.html @@ -4,8 +4,8 @@ -28 formate de fișiere - PDF, DOCX, PNG, ZIP și altele - +29 formate de fișiere - PDF, DOCX, PNG, ZIP și altele + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                              -

                              28 formate de fișiere, fiecare generat la o dimensiune exactă

                              +

                              29 formate de fișiere, fiecare generat la o dimensiune exactă

                              Fiecare este un fișier real al acelui format. Se deschide în programul căruia îi aparține și are exact numărul de octeți pe care l-ai cerut. Niciunul nu e umplutură de zerouri cu @@ -196,6 +196,14 @@

                              28 formate de fișiere, fiecare generat la o dimensiune exactă

                              full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -498,6 +506,41 @@

                              Setările pe care le acceptă fiecare format

                              paragraphs 1 - 50000 paragrafe + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 zecimale + + + + altitude + adevărat sau fals + + + + vertices + 3 - 1000000 puncte + + + + winding + reversed, rfc7946 + + + + antimeridian + adevărat sau fals + gif width diff --git a/web/public/ro/index.html b/web/public/ro/index.html index bdf01500..ff79817e 100644 --- a/web/public/ro/index.html +++ b/web/public/ro/index.html @@ -4,7 +4,7 @@ -Generator de fișiere de test - dimensiune exactă, 28 formate reale +Generator de fișiere de test - dimensiune exactă, 29 formate reale @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Un generator gratuit și open source de fișiere de test pentru QA. Produce fișiere reale în 28 formate, la dimensiunea exactă, și scrie un manifest care spune cum trebuie să reacționeze sistemul testat la fiecare.", + "description": "Un generator gratuit și open source de fișiere de test pentru QA. Produce fișiere reale în 29 formate, la dimensiunea exactă, și scrie un manifest care spune cum trebuie să reacționeze sistemul testat la fiecare.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                              Generează fișiere de test reale la dimensiunea exactă

                              - PDF, PNG, DOCX, ZIP - 28 formate în total, și fiecare este un + PDF, PNG, DOCX, ZIP - 29 formate în total, și fiecare este un fișier real care se deschide în programul căruia îi aparține, la exact dimensiunea pe care ai cerut-o. Fiecare rulare notează și ce trebuie să facă aplicația ta cu fiecare fișier. Linie de comandă și fereastră desktop, gratuit și open source, funcționând în întregime @@ -180,7 +180,7 @@

                              Generează fișiere de test reale la dimensiunea exactă

                              • - 28 + 29

                                formate reale, fiecare se deschide în programul căruia îi aparține

                              • @@ -343,7 +343,7 @@

                                Construit pentru o suită care rulează nesupravegheată

                                Cere 10485761 de octeți și primești exact atât. O dimensiune pe care un format nu o poate atinge este o eroare cu un motiv, niciodată un fișier de dimensiune greșită.

                              • -

                                28 formate reale

                                +

                                29 formate reale

                                Nu zerouri de umplutură cu o extensie. Un PNG generat se deschide într-un vizualizator de imagini, un DOCX se deschide în Word, un ZIP se extrage. Fiecare este verificat cu cititori independenți înainte de livrare.

                              • diff --git a/web/public/ro/intrebari-frecvente/index.html b/web/public/ro/intrebari-frecvente/index.html index b39d4dbf..53a85d84 100644 --- a/web/public/ro/intrebari-frecvente/index.html +++ b/web/public/ro/intrebari-frecvente/index.html @@ -206,7 +206,7 @@

                                Întrebări frecvente

                                Ce formate urmează?

                                -

                                7z, mp3 și mp4. Azi funcționează de la un capăt la altul 28 formate.

                                +

                                7z și mp3. Azi funcționează de la un capăt la altul 29 formate.

                                @@ -277,7 +277,7 @@

                                Întrebări frecvente

                                { "@type": "Question", "name": "Ce formate urmează?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 și mp4. Azi funcționează de la un capăt la altul 28 formate." } + "acceptedAnswer": { "@type": "Answer", "text": "7z și mp3. Azi funcționează de la un capăt la altul 29 formate." } }, { "@type": "Question", diff --git a/web/public/ro/presetari/empty-and-minimal/index.html b/web/public/ro/presetari/empty-and-minimal/index.html index 68a9e9af..bfd0a851 100644 --- a/web/public/ro/presetari/empty-and-minimal/index.html +++ b/web/public/ro/presetari/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Cele mai mici fișiere de test valide și goale, în fiecare format - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

                                Ce este în set?

                                - - - - + + + +
                                Fișiere30
                                Targeturi în rețeta lui30
                                Dimensiune totală39 263 B
                                Formateavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                Fișiere31
                                Targeturi în rețeta lui31
                                Dimensiune totală40 138 B
                                Formateavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                @@ -193,7 +193,7 @@

                                Ce este în set?

                                AșteptatSemnificațieFișiere - acceptSistemul tău trebuie să accepte fișierul.28 + acceptSistemul tău trebuie să accepte fișierul.29 unspecifiedDepinde de regulile sistemului tău. Tu decizi, apoi verifici că ce se întâmplă este ce ai vrut.2 diff --git a/web/public/ru/corrupt-test-files/index.html b/web/public/ru/corrupt-test-files/index.html index d2e87c4e..1702281e 100644 --- a/web/public/ru/corrupt-test-files/index.html +++ b/web/public/ru/corrupt-test-files/index.html @@ -202,7 +202,7 @@

                                Повреждённый файл остаётся нужного разме tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                Настройки пишутся после двоеточия. Параметр можно повторять, а повреждения применяются в том - порядке, в каком вы их записали. Это работает с каждым из 28 форматов. + порядке, в каком вы их записали. Это работает с каждым из 29 форматов.

                                diff --git a/web/public/ru/faq/index.html b/web/public/ru/faq/index.html index 7a235b9e..4be01528 100644 --- a/web/public/ru/faq/index.html +++ b/web/public/ru/faq/index.html @@ -206,7 +206,7 @@

                                Часто задаваемые вопросы

                                Какие форматы появятся дальше?

                                -

                                7z, mp3 и mp4. Сегодня полностью работают 28 форматов.

                                +

                                7z и mp3. Сегодня полностью работают 29 форматов.

                                @@ -277,7 +277,7 @@

                                Часто задаваемые вопросы

                                { "@type": "Question", "name": "Какие форматы появятся дальше?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 и mp4. Сегодня полностью работают 28 форматов." } + "acceptedAnswer": { "@type": "Answer", "text": "7z и mp3. Сегодня полностью работают 29 форматов." } }, { "@type": "Question", diff --git a/web/public/ru/formats/index.html b/web/public/ru/formats/index.html index c0ba76c0..0ed6a261 100644 --- a/web/public/ru/formats/index.html +++ b/web/public/ru/formats/index.html @@ -4,8 +4,8 @@ -28 форматов файлов - PDF, DOCX, PNG, ZIP и другие - +29 форматов файлов - PDF, DOCX, PNG, ZIP и другие + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                -

                                28 форматов файлов, каждый создаётся точного размера

                                +

                                29 форматов файлов, каждый создаётся точного размера

                                Каждый из них - настоящий файл этого формата. Он открывается в своей программе и имеет ровно то число байт, которое вы запросили. Ни один не является нулями-заполнителями с @@ -196,6 +196,14 @@

                                28 форматов файлов, каждый создаётся точно full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

                                Настройки, которые принимает каждый форм paragraphs 1 - 50000 абзацев + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 знаков после запятой + + + + altitude + истина или ложь + + + + vertices + 3 - 1000000 точек + + + + winding + reversed, rfc7946 + + + + antimeridian + истина или ложь + gif width diff --git a/web/public/ru/index.html b/web/public/ru/index.html index 610f008a..990453a5 100644 --- a/web/public/ru/index.html +++ b/web/public/ru/index.html @@ -4,7 +4,7 @@ -Генератор тестовых файлов для QA - точный размер, 28 форматов +Генератор тестовых файлов для QA - точный размер, 29 форматов @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Бесплатный генератор тестовых файлов для QA с открытым кодом. Создаёт настоящие файлы в 28 форматах точного размера и записывает манифест с ожидаемой реакцией тестируемой системы на каждый из них.", + "description": "Бесплатный генератор тестовых файлов для QA с открытым кодом. Создаёт настоящие файлы в 29 форматах точного размера и записывает манифест с ожидаемой реакцией тестируемой системы на каждый из них.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                Создавайте настоящие тестовые файлы точного размера

                                - PDF, PNG, DOCX, ZIP - всего 28 форматов, и каждый из них + PDF, PNG, DOCX, ZIP - всего 29 форматов, и каждый из них настоящий файл, который открывается в своей программе, точно того размера, который вы запросили. Каждый запуск ещё и записывает, что ваше приложение должно делать с каждым файлом. Командная строка и десктопное окно, бесплатно и с открытым кодом, всё работает на вашей @@ -180,7 +180,7 @@

                                Создавайте настоящие тестовые файлы точн
                                • - 28 + 29

                                  настоящих форматов, каждый открывается в своей программе

                                • @@ -343,7 +343,7 @@

                                  Создан для набора тестов, работающего без

                                  Запросите 10485761 байт и получите ровно столько. Размер, которого формат не может достичь, - это ошибка с причиной, а не файл неверного размера.

                                • -

                                  28 настоящих форматов

                                  +

                                  29 настоящих форматов

                                  Не нули-заполнители с расширением. Созданный PNG открывается в просмотрщике изображений, DOCX - в Word, ZIP распаковывается. Каждый формат проверяется независимыми читателями до выпуска.

                                • diff --git a/web/public/ru/presets/empty-and-minimal/index.html b/web/public/ru/presets/empty-and-minimal/index.html index 490082d7..5b2b8454 100644 --- a/web/public/ru/presets/empty-and-minimal/index.html +++ b/web/public/ru/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Минимальные корректные и пустые тестовые файлы в каждом формате - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                                  Что входит в набор?

                                  - - - - + + + +
                                  Файлов30
                                  Целей в его рецепте30
                                  Общий размер39 263 B
                                  Форматыavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  Файлов31
                                  Целей в его рецепте31
                                  Общий размер40 138 B
                                  Форматыavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  @@ -192,7 +192,7 @@

                                  Что входит в набор?

                                  ОжидаетсяЗначениеФайлов - acceptВаша система должна принять файл.28 + acceptВаша система должна принять файл.29 unspecifiedЗависит от правил вашей системы. Вы решаете, а затем проверяете, что происходит именно то, что вы имели в виду.2 diff --git a/web/public/social.html b/web/public/social.html index 66859ac3..6d88976c 100644 --- a/web/public/social.html +++ b/web/public/social.html @@ -203,7 +203,7 @@

                                  Test sets,
                                  not just files.

                                  • Presets - ready test sets for size limits, file names, encodings and imports
                                  • Recipes - one YAML file, same bytes in every CI run
                                  • -
                                  • 28 formats with their own settings - pages, pixels, rows, archive contents
                                  • +
                                  • 29 formats with their own settings - pages, pixels, rows, archive contents

                                  Free and open source · works offline · Windows · macOS · Linux

                                diff --git a/web/public/th/corrupt-test-files/index.html b/web/public/th/corrupt-test-files/index.html index 52d78c1e..a21d6d96 100644 --- a/web/public/th/corrupt-test-files/index.html +++ b/web/public/th/corrupt-test-files/index.html @@ -199,7 +199,7 @@

                                ไฟล์ที่เสียหายยังมีขนาดตา tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                การตั้งค่าเขียนหลังเครื่องหมายทวิภาค ตัวเลือกนี้ใส่ซ้ำได้ - และความเสียหายจะถูกนำมาใช้ตามลำดับที่คุณเขียน ใช้ได้กับทั้ง 28 รูปแบบ + และความเสียหายจะถูกนำมาใช้ตามลำดับที่คุณเขียน ใช้ได้กับทั้ง 29 รูปแบบ

                                diff --git a/web/public/th/faq/index.html b/web/public/th/faq/index.html index d56818f8..a27f70ee 100644 --- a/web/public/th/faq/index.html +++ b/web/public/th/faq/index.html @@ -205,7 +205,7 @@

                                คำถามที่พบบ่อย

                                รูปแบบใดจะมาต่อไป

                                -

                                7z, mp3 และ mp4 ตอนนี้ 28 รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ

                                +

                                7z และ mp3 ตอนนี้ 29 รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ

                                @@ -276,7 +276,7 @@

                                คำถามที่พบบ่อย

                                { "@type": "Question", "name": "รูปแบบใดจะมาต่อไป", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 และ mp4 ตอนนี้ 28 รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ" } + "acceptedAnswer": { "@type": "Answer", "text": "7z และ mp3 ตอนนี้ 29 รูปแบบทำงานได้ครบตั้งแต่ต้นจนจบ" } }, { "@type": "Question", diff --git a/web/public/th/formats/index.html b/web/public/th/formats/index.html index e515e90f..130b74d8 100644 --- a/web/public/th/formats/index.html +++ b/web/public/th/formats/index.html @@ -4,8 +4,8 @@ -28 รูปแบบไฟล์ที่รองรับ - PDF, DOCX, PNG, ZIP และอื่นๆ - +29 รูปแบบไฟล์ที่รองรับ - PDF, DOCX, PNG, ZIP และอื่นๆ + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                -

                                28 รูปแบบไฟล์ แต่ละรูปแบบสร้างที่ขนาดแม่นยำ

                                +

                                29 รูปแบบไฟล์ แต่ละรูปแบบสร้างที่ขนาดแม่นยำ

                                ทุกรูปแบบเป็นไฟล์จริงของรูปแบบนั้น เปิดได้ในซอฟต์แวร์ของมัน และมีจำนวนไบต์ตรงตามที่คุณขอพอดี ไม่มีรูปแบบใดเป็นศูนย์เติมเต็มที่แปะนามสกุลเข้าไป @@ -195,6 +195,14 @@

                                28 รูปแบบไฟล์ แต่ละรูปแบบสร้ full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -495,6 +503,41 @@

                                การตั้งค่าที่แต่ละรูปแบบร paragraphs 1 - 50000 ย่อหน้า + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 ตำแหน่งทศนิยม + + + + altitude + จริงหรือเท็จ + + + + vertices + 3 - 1000000 จุด + + + + winding + reversed, rfc7946 + + + + antimeridian + จริงหรือเท็จ + gif width diff --git a/web/public/th/index.html b/web/public/th/index.html index 5f0ef85b..06f4c585 100644 --- a/web/public/th/index.html +++ b/web/public/th/index.html @@ -4,7 +4,7 @@ -ตัวสร้างไฟล์ทดสอบสำหรับ QA - ขนาดแม่นยำ 28 รูปแบบจริง +ตัวสร้างไฟล์ทดสอบสำหรับ QA - ขนาดแม่นยำ 29 รูปแบบจริง @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "ตัวสร้างไฟล์ทดสอบสำหรับ QA ฟรีและโอเพนซอร์ส สร้างไฟล์จริงใน 28 รูปแบบด้วยขนาดแม่นยำ และเขียนแมนิเฟสต์ที่บอกว่าระบบที่ถูกทดสอบควรตอบสนองต่อแต่ละไฟล์อย่างไร", + "description": "ตัวสร้างไฟล์ทดสอบสำหรับ QA ฟรีและโอเพนซอร์ส สร้างไฟล์จริงใน 29 รูปแบบด้วยขนาดแม่นยำ และเขียนแมนิเฟสต์ที่บอกว่าระบบที่ถูกทดสอบควรตอบสนองต่อแต่ละไฟล์อย่างไร", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                สร้างไฟล์ทดสอบจริงที่ขนาดแม่นยำ

                                - PDF, PNG, DOCX, ZIP - รวม 28 รูปแบบ + PDF, PNG, DOCX, ZIP - รวม 29 รูปแบบ และทุกไฟล์เป็นไฟล์จริงที่เปิดได้ในซอฟต์แวร์ของมัน ด้วยขนาดตรงตามที่คุณขอพอดี ทุกครั้งที่รันยังจดด้วยว่าแอปพลิเคชันของคุณควรทำอย่างไรกับแต่ละไฟล์ มีทั้งบรรทัดคำสั่งและหน้าต่างเดสก์ท็อป ฟรีและโอเพนซอร์ส ทำงานทั้งหมดบนเครื่องของคุณ @@ -179,7 +179,7 @@

                                สร้างไฟล์ทดสอบจริงที่ขนาด
                                • - 28 + 29

                                  รูปแบบจริง แต่ละรูปแบบเปิดได้ในซอฟต์แวร์ของมัน

                                • @@ -341,7 +341,7 @@

                                  สร้างมาสำหรับชุดทดสอบที่ร

                                  ขอ 10485761 ไบต์ แล้วได้ตามนั้นพอดี ขนาดที่รูปแบบไปไม่ถึงคือข้อผิดพลาดที่มีเหตุผล ไม่ใช่ไฟล์ขนาดผิด

                                • -

                                  28 รูปแบบจริง

                                  +

                                  29 รูปแบบจริง

                                  ไม่ใช่ศูนย์ที่เติมเต็มพร้อมนามสกุล PNG ที่สร้างเปิดได้ในโปรแกรมดูภาพ DOCX เปิดได้ใน Word และ ZIP แตกไฟล์ได้ ทุกรูปแบบถูกตรวจด้วยตัวอ่านอิสระก่อนปล่อย

                                • diff --git a/web/public/th/presets/empty-and-minimal/index.html b/web/public/th/presets/empty-and-minimal/index.html index 5432b0ce..19937282 100644 --- a/web/public/th/presets/empty-and-minimal/index.html +++ b/web/public/th/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ ไฟล์ทดสอบที่ถูกต้องเล็กที่สุดและไฟล์ว่างในทุกรูปแบบ - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                                  ในชุดมีอะไร

                                  - - - - + + + +
                                  ไฟล์30
                                  target ในสูตรของมัน30
                                  ขนาดรวม39 263 B
                                  รูปแบบavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  ไฟล์31
                                  target ในสูตรของมัน31
                                  ขนาดรวม40 138 B
                                  รูปแบบavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  @@ -192,7 +192,7 @@

                                  ในชุดมีอะไร

                                  ที่คาดหวังความหมายไฟล์ - acceptระบบของคุณควรยอมรับไฟล์นี้28 + acceptระบบของคุณควรยอมรับไฟล์นี้29 unspecifiedขึ้นอยู่กับกฎของระบบของคุณ คุณเป็นผู้ตัดสิน แล้วตรวจสอบว่าสิ่งที่เกิดขึ้นตรงกับที่ตั้งใจ2 diff --git a/web/public/tr/bicimler/index.html b/web/public/tr/bicimler/index.html index 995ef1b9..57a362aa 100644 --- a/web/public/tr/bicimler/index.html +++ b/web/public/tr/bicimler/index.html @@ -4,8 +4,8 @@ -28 desteklenen dosya biçimi - PDF, DOCX, PNG, ZIP ve daha fazlası - +29 desteklenen dosya biçimi - PDF, DOCX, PNG, ZIP ve daha fazlası + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                  -

                                  28 dosya biçimi, her biri tam boyutta üretilir

                                  +

                                  29 dosya biçimi, her biri tam boyutta üretilir

                                  Bunların her biri o biçimde gerçek bir dosyadır. Ait olduğu programda açılır ve tam istediğiniz bayt sayısındadır. Hiçbiri yapıştırılmış uzantılı dolgu sıfırları değildir. @@ -195,6 +195,14 @@

                                  28 dosya biçimi, her biri tam boyutta üretilir

                                  full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

                                  Her biçimin kabul ettiği ayarlar

                                  paragraphs 1 - 50000 paragraf + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 ondalık basamak + + + + altitude + doğru veya yanlış + + + + vertices + 3 - 1000000 nokta + + + + winding + reversed, rfc7946 + + + + antimeridian + doğru veya yanlış + gif width diff --git a/web/public/tr/bozuk-test-dosyalari/index.html b/web/public/tr/bozuk-test-dosyalari/index.html index b8bf1144..3f466f09 100644 --- a/web/public/tr/bozuk-test-dosyalari/index.html +++ b/web/public/tr/bozuk-test-dosyalari/index.html @@ -201,7 +201,7 @@

                                  Hasarlı bir dosya yine istediğiniz boyuttadır

                                  tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                  Ayarlar iki noktadan sonra yazılır. Seçenek tekrarlanabilir ve hasarlar yazdığınız sırayla - uygulanır. 28 biçimin her biriyle çalışır. + uygulanır. 29 biçimin her biriyle çalışır.

                                  diff --git a/web/public/tr/hazir-ayarlar/empty-and-minimal/index.html b/web/public/tr/hazir-ayarlar/empty-and-minimal/index.html index 19a45fc5..c2c35f89 100644 --- a/web/public/tr/hazir-ayarlar/empty-and-minimal/index.html +++ b/web/public/tr/hazir-ayarlar/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Her biçimde en küçük geçerli ve boş test dosyaları - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -179,10 +179,10 @@

                                  Sette ne var?

                                  - - - - + + + +
                                  Dosya30
                                  Tarifindeki hedefler30
                                  Toplam boyut39 263 B
                                  Biçimleravif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  Dosya31
                                  Tarifindeki hedefler31
                                  Toplam boyut40 138 B
                                  Biçimleravif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                  @@ -193,7 +193,7 @@

                                  Sette ne var?

                                  BeklenenAnlamıDosya - acceptSisteminiz dosyayı kabul etmeli.28 + acceptSisteminiz dosyayı kabul etmeli.29 unspecifiedSisteminizin kurallarına bağlı. Siz karar verirsiniz, sonra olanın amaçladığınız şey olduğunu doğrularsınız.2 diff --git a/web/public/tr/index.html b/web/public/tr/index.html index 30e5113f..fa1e802a 100644 --- a/web/public/tr/index.html +++ b/web/public/tr/index.html @@ -4,7 +4,7 @@ -QA için test dosyası oluşturucu - tam boyut, 28 gerçek biçim +QA için test dosyası oluşturucu - tam boyut, 29 gerçek biçim @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "QA için ücretsiz ve açık kaynaklı bir test dosyası oluşturucu. 28 biçimde tam boyutta gerçek dosyalar üretir ve test edilen sistemin her birine nasıl tepki vermesi gerektiğini söyleyen bir manifest yazar.", + "description": "QA için ücretsiz ve açık kaynaklı bir test dosyası oluşturucu. 29 biçimde tam boyutta gerçek dosyalar üretir ve test edilen sistemin her birine nasıl tepki vermesi gerektiğini söyleyen bir manifest yazar.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                  Tam boyutta gerçek test dosyaları üretin

                                  - PDF, PNG, DOCX, ZIP - toplam 28 biçim ve her biri ait olduğu + PDF, PNG, DOCX, ZIP - toplam 29 biçim ve her biri ait olduğu programda açılan, tam istediğiniz boyutta gerçek bir dosya. Her çalıştırma ayrıca uygulamanızın her dosyayla ne yapması gerektiğini de yazar. Komut satırı ve masaüstü penceresi, ücretsiz ve açık kaynak, tamamen makinenizde çalışır. @@ -179,7 +179,7 @@

                                  Tam boyutta gerçek test dosyaları üretin

                                  • - 28 + 29

                                    gerçek biçim, her biri ait olduğu programda açılır

                                  • @@ -342,7 +342,7 @@

                                    Gözetimsiz çalışan bir test takımı için yapıldı

                                    10485761 bayt isteyin ve tam olarak onu alın. Bir biçimin ulaşamayacağı boyut nedeni olan bir hatadır, asla yanlış boyutta bir dosya değil.

                                  • -

                                    28 gerçek biçim

                                    +

                                    29 gerçek biçim

                                    Uzantılı dolgu sıfırları değil. Üretilmiş bir PNG resim görüntüleyicide, bir DOCX Word'de açılır, bir ZIP çıkarılır. Her biri yayımlanmadan önce bağımsız okuyucularla doğrulanır.

                                  • diff --git a/web/public/tr/sss/index.html b/web/public/tr/sss/index.html index 6fc70dd7..e9673683 100644 --- a/web/public/tr/sss/index.html +++ b/web/public/tr/sss/index.html @@ -205,7 +205,7 @@

                                    Sık sorulan sorular

                                    Sırada hangi biçimler var?

                                    -

                                    7z, mp3 ve mp4. Bugün 28 biçim uçtan uca çalışıyor.

                                    +

                                    7z ve mp3. Bugün 29 biçim uçtan uca çalışıyor.

                                    @@ -276,7 +276,7 @@

                                    Sık sorulan sorular

                                    { "@type": "Question", "name": "Sırada hangi biçimler var?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 ve mp4. Bugün 28 biçim uçtan uca çalışıyor." } + "acceptedAnswer": { "@type": "Answer", "text": "7z ve mp3. Bugün 29 biçim uçtan uca çalışıyor." } }, { "@type": "Question", diff --git a/web/public/uk/corrupt-test-files/index.html b/web/public/uk/corrupt-test-files/index.html index d8bcdaee..4f3c8225 100644 --- a/web/public/uk/corrupt-test-files/index.html +++ b/web/public/uk/corrupt-test-files/index.html @@ -202,7 +202,7 @@

                                    Пошкоджений файл лишається потрібного ро tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                    Налаштування пишуться після двокрапки. Параметр можна повторювати, а пошкодження застосовуються в - тому порядку, в якому ви їх записали. Це працює з кожним із 28 форматів. + тому порядку, в якому ви їх записали. Це працює з кожним із 29 форматів.

                                    diff --git a/web/public/uk/faq/index.html b/web/public/uk/faq/index.html index 55afef03..9f7eec81 100644 --- a/web/public/uk/faq/index.html +++ b/web/public/uk/faq/index.html @@ -206,7 +206,7 @@

                                    Часті запитання

                                    Які формати з'являться далі?

                                    -

                                    7z, mp3 і mp4. Сьогодні повністю працюють 28 форматів.

                                    +

                                    7z і mp3. Сьогодні повністю працюють 29 форматів.

                                    @@ -277,7 +277,7 @@

                                    Часті запитання

                                    { "@type": "Question", "name": "Які формати з\u0027являться далі?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 і mp4. Сьогодні повністю працюють 28 форматів." } + "acceptedAnswer": { "@type": "Answer", "text": "7z і mp3. Сьогодні повністю працюють 29 форматів." } }, { "@type": "Question", diff --git a/web/public/uk/formats/index.html b/web/public/uk/formats/index.html index 1c77e57b..cf303568 100644 --- a/web/public/uk/formats/index.html +++ b/web/public/uk/formats/index.html @@ -4,8 +4,8 @@ -28 форматів файлів - PDF, DOCX, PNG, ZIP та інші - +29 форматів файлів - PDF, DOCX, PNG, ZIP та інші + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                    -

                                    28 форматів файлів, кожен створюється точного розміру

                                    +

                                    29 форматів файлів, кожен створюється точного розміру

                                    Кожен із них - справжній файл цього формату. Він відкривається у своїй програмі та має рівно стільки байтів, скільки ви запросили. Жоден не є нулями-заповнювачами з приклеєним @@ -196,6 +196,14 @@

                                    28 форматів файлів, кожен створюється точн full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -497,6 +505,41 @@

                                    Налаштування, які приймає кожен формат

                                    paragraphs 1 - 50000 абзаців + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 знаків після коми + + + + altitude + істина або хибність + + + + vertices + 3 - 1000000 точок + + + + winding + reversed, rfc7946 + + + + antimeridian + істина або хибність + gif width diff --git a/web/public/uk/index.html b/web/public/uk/index.html index 7e2a1c2f..5eec5568 100644 --- a/web/public/uk/index.html +++ b/web/public/uk/index.html @@ -4,7 +4,7 @@ -Генератор тестових файлів для QA - точний розмір, 28 форматів +Генератор тестових файлів для QA - точний розмір, 29 форматів @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Безкоштовний генератор тестових файлів для QA з відкритим кодом. Створює справжні файли у 28 форматах точного розміру й записує маніфест з очікуваною реакцією тестованої системи на кожен із них.", + "description": "Безкоштовний генератор тестових файлів для QA з відкритим кодом. Створює справжні файли у 29 форматах точного розміру й записує маніфест з очікуваною реакцією тестованої системи на кожен із них.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                    Створюйте справжні тестові файли точного розміру

                                    - PDF, PNG, DOCX, ZIP - усього 28 форматів, і кожен із них - + PDF, PNG, DOCX, ZIP - усього 29 форматів, і кожен із них - справжній файл, що відкривається у своїй програмі, точно того розміру, який ви запросили. Кожен запуск ще й записує, що ваш застосунок має робити з кожним файлом. Командний рядок і десктопне вікно, безкоштовно та з відкритим кодом, усе працює на вашій машині. @@ -179,7 +179,7 @@

                                    Створюйте справжні тестові файли точного
                                    • - 28 + 29

                                      справжніх форматів, кожен відкривається у своїй програмі

                                    • @@ -342,7 +342,7 @@

                                      Створений для набору тестів, що працює бе

                                      Запросіть 10485761 байт і отримайте рівно стільки. Розмір, якого формат не може досягти, - це помилка з причиною, а не файл неправильного розміру.

                                    • -

                                      28 справжніх форматів

                                      +

                                      29 справжніх форматів

                                      Не нулі-заповнювачі з розширенням. Створений PNG відкривається в переглядачі зображень, DOCX - у Word, ZIP розпаковується. Кожен формат перевіряється незалежними читачами до випуску.

                                    • diff --git a/web/public/uk/presets/empty-and-minimal/index.html b/web/public/uk/presets/empty-and-minimal/index.html index e7511b13..49485417 100644 --- a/web/public/uk/presets/empty-and-minimal/index.html +++ b/web/public/uk/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Мінімальні коректні та порожні тестові файли в кожному форматі - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                                      Що входить у набір?

                                      - - - - + + + +
                                      Файлів30
                                      Цілей у його рецепті30
                                      Загальний розмір39 263 B
                                      Форматиavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                      Файлів31
                                      Цілей у його рецепті31
                                      Загальний розмір40 138 B
                                      Форматиavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                      @@ -192,7 +192,7 @@

                                      Що входить у набір?

                                      ОчікуєтьсяЗначенняФайлів - acceptВаша система має прийняти файл.28 + acceptВаша система має прийняти файл.29 unspecifiedЗалежить від правил вашої системи. Ви вирішуєте, а потім перевіряєте, що відбувається саме те, що ви мали на увазі.2 diff --git a/web/public/vi/dinh-dang/index.html b/web/public/vi/dinh-dang/index.html index 914213cd..56bf3356 100644 --- a/web/public/vi/dinh-dang/index.html +++ b/web/public/vi/dinh-dang/index.html @@ -4,8 +4,8 @@ -28 định dạng tệp được hỗ trợ - PDF, DOCX, PNG, ZIP và hơn nữa - +29 định dạng tệp được hỗ trợ - PDF, DOCX, PNG, ZIP và hơn nữa + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                      -

                                      28 định dạng tệp, mỗi định dạng được tạo ở kích thước chính xác

                                      +

                                      29 định dạng tệp, mỗi định dạng được tạo ở kích thước chính xác

                                      Mỗi cái là một tệp thật của định dạng đó. Nó mở được bằng phần mềm của nó và có đúng số byte bạn đã yêu cầu. Không cái nào là số không độn với phần mở rộng dán vào. @@ -195,6 +195,14 @@

                                      28 định dạng tệp, mỗi định dạng được tạo ở kích thư full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -495,6 +503,41 @@

                                      Các thiết lập mỗi định dạng nhận

                                      paragraphs 1 - 50000 đoạn văn + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 chữ số thập phân + + + + altitude + đúng hoặc sai + + + + vertices + 3 - 1000000 điểm + + + + winding + reversed, rfc7946 + + + + antimeridian + đúng hoặc sai + gif width diff --git a/web/public/vi/faq/index.html b/web/public/vi/faq/index.html index b69606dc..89d3b895 100644 --- a/web/public/vi/faq/index.html +++ b/web/public/vi/faq/index.html @@ -206,7 +206,7 @@

                                      Câu hỏi thường gặp

                                      Những định dạng nào sắp có?

                                      -

                                      7z, mp3 và mp4. Hôm nay có 28 định dạng hoạt động trọn vẹn từ đầu đến cuối.

                                      +

                                      7z và mp3. Hôm nay có 29 định dạng hoạt động trọn vẹn từ đầu đến cuối.

                                      @@ -277,7 +277,7 @@

                                      Câu hỏi thường gặp

                                      { "@type": "Question", "name": "Những định dạng nào sắp có?", - "acceptedAnswer": { "@type": "Answer", "text": "7z, mp3 và mp4. Hôm nay có 28 định dạng hoạt động trọn vẹn từ đầu đến cuối." } + "acceptedAnswer": { "@type": "Answer", "text": "7z và mp3. Hôm nay có 29 định dạng hoạt động trọn vẹn từ đầu đến cuối." } }, { "@type": "Question", diff --git a/web/public/vi/index.html b/web/public/vi/index.html index a295533b..b8be52ae 100644 --- a/web/public/vi/index.html +++ b/web/public/vi/index.html @@ -4,7 +4,7 @@ -Trình tạo tệp kiểm thử cho QA - kích thước chính xác, 28 định dạng +Trình tạo tệp kiểm thử cho QA - kích thước chính xác, 29 định dạng @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "Trình tạo tệp kiểm thử miễn phí, mã nguồn mở cho QA. Nó tạo tệp thật ở 28 định dạng, đúng kích thước, và ghi manifest nêu cách hệ thống được kiểm thử cần phản ứng với từng tệp.", + "description": "Trình tạo tệp kiểm thử miễn phí, mã nguồn mở cho QA. Nó tạo tệp thật ở 29 định dạng, đúng kích thước, và ghi manifest nêu cách hệ thống được kiểm thử cần phản ứng với từng tệp.", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                      Tạo tệp kiểm thử thật đúng kích thước

                                      - PDF, PNG, DOCX, ZIP - tổng cộng 28 định dạng, và mỗi tệp là + PDF, PNG, DOCX, ZIP - tổng cộng 29 định dạng, và mỗi tệp là tệp thật mở được bằng phần mềm của nó, ở đúng kích thước bạn yêu cầu. Mỗi lần chạy còn ghi lại ứng dụng của bạn cần làm gì với từng tệp. Dòng lệnh và cửa sổ desktop, miễn phí, mã nguồn mở, chạy hoàn toàn trên máy của bạn. @@ -179,7 +179,7 @@

                                      Tạo tệp kiểm thử thật đúng kích thước

                                      • - 28 + 29

                                        định dạng thật, mỗi định dạng mở được bằng phần mềm của nó

                                      • @@ -341,7 +341,7 @@

                                        Làm cho bộ kiểm thử chạy không cần người trông

                                        Yêu cầu 10485761 byte và nhận đúng như vậy. Kích thước mà định dạng không thể đạt là một lỗi có lý do, không bao giờ là tệp sai kích thước.

                                      • -

                                        28 định dạng thật

                                        +

                                        29 định dạng thật

                                        Không phải số không độn kèm một phần mở rộng. PNG được tạo mở trong trình xem ảnh, DOCX mở trong Word, ZIP giải nén được. Mỗi định dạng được kiểm tra bằng các trình đọc độc lập trước khi phát hành.

                                      • diff --git a/web/public/vi/preset/empty-and-minimal/index.html b/web/public/vi/preset/empty-and-minimal/index.html index 255bb40e..14a7080b 100644 --- a/web/public/vi/preset/empty-and-minimal/index.html +++ b/web/public/vi/preset/empty-and-minimal/index.html @@ -5,7 +5,7 @@ Tệp kiểm thử hợp lệ nhỏ nhất và tệp rỗng ở mọi định dạng - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -178,10 +178,10 @@

                                        Trong bộ có gì?

                                        - - - - + + + +
                                        Tệp30
                                        Target trong công thức của nó30
                                        Tổng kích thước39 263 B
                                        Định dạngavif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                        Tệp31
                                        Target trong công thức của nó31
                                        Tổng kích thước40 138 B
                                        Định dạngavif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                        @@ -192,7 +192,7 @@

                                        Trong bộ có gì?

                                        Mong đợiÝ nghĩaTệp - acceptHệ thống của bạn nên nhận tệp.28 + acceptHệ thống của bạn nên nhận tệp.29 unspecifiedTùy vào quy tắc của hệ thống bạn. Bạn quyết định, rồi kiểm tra điều xảy ra có đúng ý bạn không.2 diff --git a/web/public/vi/tep-kiem-thu-bi-hong/index.html b/web/public/vi/tep-kiem-thu-bi-hong/index.html index e572942f..4620dc04 100644 --- a/web/public/vi/tep-kiem-thu-bi-hong/index.html +++ b/web/public/vi/tep-kiem-thu-bi-hong/index.html @@ -199,7 +199,7 @@

                                        Tệp bị hỏng vẫn có kích thước bạn đã yêu cầu

                                        tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                        Cài đặt viết sau dấu hai chấm. Tùy chọn có thể lặp lại, và các hỏng hóc được áp dụng theo thứ tự bạn - viết. Nó dùng được với từng định dạng trong 28 định dạng. + viết. Nó dùng được với từng định dạng trong 29 định dạng.

                                        diff --git a/web/public/zh-hans/corrupt-test-files/index.html b/web/public/zh-hans/corrupt-test-files/index.html index 3993288c..38d47ad0 100644 --- a/web/public/zh-hans/corrupt-test-files/index.html +++ b/web/public/zh-hans/corrupt-test-files/index.html @@ -189,7 +189,7 @@

                                        损坏的文件仍然是你要求的大小

                                        tfg generate --format png --size 2mb --damage zero-head --out ./out
                                         tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                        - 设置写在冒号之后。该选项可以重复,损坏按你写下的顺序依次应用。它适用于全部 28 种格式。 + 设置写在冒号之后。该选项可以重复,损坏按你写下的顺序依次应用。它适用于全部 29 种格式。

                                        diff --git a/web/public/zh-hans/faq/index.html b/web/public/zh-hans/faq/index.html index e7cb150d..06022f8a 100644 --- a/web/public/zh-hans/faq/index.html +++ b/web/public/zh-hans/faq/index.html @@ -204,7 +204,7 @@

                                        常见问题

                                        接下来会支持哪些格式?

                                        -

                                        7z、mp3 和 mp4。目前有 28 种格式可以端到端使用。

                                        +

                                        7z 和 mp3。目前有 29 种格式可以端到端使用。

                                        @@ -275,7 +275,7 @@

                                        常见问题

                                        { "@type": "Question", "name": "接下来会支持哪些格式?", - "acceptedAnswer": { "@type": "Answer", "text": "7z、mp3 和 mp4。目前有 28 种格式可以端到端使用。" } + "acceptedAnswer": { "@type": "Answer", "text": "7z 和 mp3。目前有 29 种格式可以端到端使用。" } }, { "@type": "Question", diff --git a/web/public/zh-hans/formats/index.html b/web/public/zh-hans/formats/index.html index 9b0d9333..b980a1b5 100644 --- a/web/public/zh-hans/formats/index.html +++ b/web/public/zh-hans/formats/index.html @@ -4,8 +4,8 @@ -28 种支持的文件格式 - PDF、DOCX、PNG、ZIP 等 - +29 种支持的文件格式 - PDF、DOCX、PNG、ZIP 等 + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                        -

                                        28 种文件格式,每一种都按精确大小生成

                                        +

                                        29 种文件格式,每一种都按精确大小生成

                                        它们每一个都是该格式的真实文件。它能在对应软件中打开,字节数恰好等于你的要求。没有一个是粘上扩展名的填充零。

                                        @@ -194,6 +194,14 @@

                                        28 种文件格式,每一种都按精确大小生成

                                        full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -489,6 +497,41 @@

                                        每种格式接受的设置

                                        paragraphs 1 - 50000 段落 + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 位小数 + + + + altitude + 真或假 + + + + vertices + 3 - 1000000 个点 + + + + winding + reversed, rfc7946 + + + + antimeridian + 真或假 + gif width diff --git a/web/public/zh-hans/index.html b/web/public/zh-hans/index.html index c0be8ffa..b69bcf94 100644 --- a/web/public/zh-hans/index.html +++ b/web/public/zh-hans/index.html @@ -4,7 +4,7 @@ -测试文件生成器 - 精确大小,28 种真实格式 +测试文件生成器 - 精确大小,29 种真实格式 @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "面向 QA 的免费开源测试文件生成器。它生成 28 种格式、大小精确的真实文件,并写出说明被测系统应如何响应每个文件的清单。", + "description": "面向 QA 的免费开源测试文件生成器。它生成 29 种格式、大小精确的真实文件,并写出说明被测系统应如何响应每个文件的清单。", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                        生成大小精确的真实测试文件

                                        - PDF、PNG、DOCX、ZIP,共 28 + PDF、PNG、DOCX、ZIP,共 29 种格式,每一种都是能在对应软件中打开的真实文件,大小恰好等于你的要求。每次运行还会写下你的应用应该如何处理每个文件。命令行加桌面窗口,免费开源,完全在你的机器上运行。

                                        @@ -177,7 +177,7 @@

                                        生成大小精确的真实测试文件

                                        • - 28 + 29

                                          种真实格式,每一种都能在对应软件中打开

                                        • @@ -332,7 +332,7 @@

                                          为无人值守的测试套件而生

                                          请求 10485761 字节,就得到恰好这么多。格式无法达到的大小会得到带原因的错误,绝不会得到大小错误的文件。

                                        • -

                                          28 种真实格式

                                          +

                                          29 种真实格式

                                          不是带扩展名的填充零。生成的 PNG 能在图片查看器中打开,DOCX 能在 Word 中打开,ZIP 能解压。每种格式在发布前都经过独立读取器验证。

                                        • diff --git a/web/public/zh-hans/presets/empty-and-minimal/index.html b/web/public/zh-hans/presets/empty-and-minimal/index.html index 2daf3eb4..3a517f1a 100644 --- a/web/public/zh-hans/presets/empty-and-minimal/index.html +++ b/web/public/zh-hans/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ 各格式最小的合法文件与空文件 - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -177,10 +177,10 @@

                                          集合里有什么?

                                          - - - - + + + +
                                          文件数30
                                          其配方中的 target 数30
                                          总大小39 263 B
                                          格式avif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                          文件数31
                                          其配方中的 target 数31
                                          总大小40 138 B
                                          格式avif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                          @@ -191,7 +191,7 @@

                                          集合里有什么?

                                          预期含义文件数 - accept你的系统应该接受这个文件。28 + accept你的系统应该接受这个文件。29 unspecified取决于你的系统规则。由你决定,然后检查实际发生的是否符合你的本意。2 diff --git a/web/public/zh-hant/corrupt-test-files/index.html b/web/public/zh-hant/corrupt-test-files/index.html index ade1f7e4..fc54336f 100644 --- a/web/public/zh-hant/corrupt-test-files/index.html +++ b/web/public/zh-hant/corrupt-test-files/index.html @@ -189,7 +189,7 @@

                                          損毀的檔案仍然是你要求的大小

                                          tfg generate --format png --size 2mb --damage zero-head --out ./out
                                           tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken

                                          - 設定寫在冒號之後。該選項可以重複,損毀依你寫下的順序逐一套用。它適用於全部 28 種格式。 + 設定寫在冒號之後。該選項可以重複,損毀依你寫下的順序逐一套用。它適用於全部 29 種格式。

                                          diff --git a/web/public/zh-hant/faq/index.html b/web/public/zh-hant/faq/index.html index bba950b8..bfde6de9 100644 --- a/web/public/zh-hant/faq/index.html +++ b/web/public/zh-hant/faq/index.html @@ -204,7 +204,7 @@

                                          常見問題

                                          接下來會支援哪些格式?

                                          -

                                          7z、mp3 與 mp4。目前有 28 種格式可以端到端使用。

                                          +

                                          7z 與 mp3。目前有 29 種格式可以端到端使用。

                                          @@ -275,7 +275,7 @@

                                          常見問題

                                          { "@type": "Question", "name": "接下來會支援哪些格式?", - "acceptedAnswer": { "@type": "Answer", "text": "7z、mp3 與 mp4。目前有 28 種格式可以端到端使用。" } + "acceptedAnswer": { "@type": "Answer", "text": "7z 與 mp3。目前有 29 種格式可以端到端使用。" } }, { "@type": "Question", diff --git a/web/public/zh-hant/formats/index.html b/web/public/zh-hant/formats/index.html index 12ea84c9..792c944a 100644 --- a/web/public/zh-hant/formats/index.html +++ b/web/public/zh-hant/formats/index.html @@ -4,8 +4,8 @@ -28 種支援的檔案格式 - PDF、DOCX、PNG、ZIP 等 - +29 種支援的檔案格式 - PDF、DOCX、PNG、ZIP 等 + @@ -33,8 +33,8 @@ - - + + @@ -62,8 +62,8 @@ - - + + @@ -144,7 +144,7 @@
                                          -

                                          28 種檔案格式,每一種都以精確大小產生

                                          +

                                          29 種檔案格式,每一種都以精確大小產生

                                          它們每一個都是該格式的真實檔案。它能在對應軟體中開啟,位元組數恰好等於你的要求。沒有一個是黏上副檔名的填充零。

                                          @@ -194,6 +194,14 @@

                                          28 種檔案格式,每一種都以精確大小產生

                                          full libreoffice + + geojson + GeoJSON + .geojson + 875 + full + gdal-geojson + gif Graphics Interchange Format @@ -489,6 +497,41 @@

                                          每種格式接受的設定

                                          paragraphs 1 - 50000 段落 + + geojson + geometry + geometrycollection, linestring, mixed, multilinestring, multipoint, multipolygon, point, polygon + + + + formatting + indented, minified, record-per-line + + + + precision + 0 - 15 位小數 + + + + altitude + 真或假 + + + + vertices + 3 - 1000000 個點 + + + + winding + reversed, rfc7946 + + + + antimeridian + 真或假 + gif width diff --git a/web/public/zh-hant/index.html b/web/public/zh-hant/index.html index 5186d084..35de19d1 100644 --- a/web/public/zh-hant/index.html +++ b/web/public/zh-hant/index.html @@ -4,7 +4,7 @@ -測試檔案產生器 - 精確大小,28 種真實格式 +測試檔案產生器 - 精確大小,29 種真實格式 @@ -33,7 +33,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -76,7 +76,7 @@ "@type": "SoftwareApplication", "name": "Testing Files Generator", "alternateName": "tfg", - "description": "專為 QA 設計的免費開源測試檔案產生器。它產生 28 種格式、大小精確的真實檔案,並寫出說明受測系統應如何回應每個檔案的清單。", + "description": "專為 QA 設計的免費開源測試檔案產生器。它產生 29 種格式、大小精確的真實檔案,並寫出說明受測系統應如何回應每個檔案的清單。", "url": "https:\/\/testingfilesgenerator.donislawdev.com/", "applicationCategory": "DeveloperApplication", "applicationSubCategory": "Software Testing", @@ -157,7 +157,7 @@

                                          產生大小精確的真實測試檔案

                                          - PDF、PNG、DOCX、ZIP,共 28 + PDF、PNG、DOCX、ZIP,共 29 種格式,每一種都是能在對應軟體中開啟的真實檔案,大小恰好等於你的要求。每次執行還會寫下你的應用程式應該如何處理每個檔案。命令列加桌面視窗,免費開源,完全在你的電腦上執行。

                                          @@ -177,7 +177,7 @@

                                          產生大小精確的真實測試檔案

                                          • - 28 + 29

                                            種真實格式,每一種都能在對應軟體中開啟

                                          • @@ -332,7 +332,7 @@

                                            為無人看管的測試套件而生

                                            要求 10485761 位元組,就得到恰好這麼多。格式無法達到的大小會得到附上原因的錯誤,絕不會得到大小錯誤的檔案。

                                          • -

                                            28 種真實格式

                                            +

                                            29 種真實格式

                                            不是帶副檔名的填充零。產生的 PNG 能在圖片檢視器中開啟,DOCX 能在 Word 中開啟,ZIP 能解壓縮。每種格式在發布前都經過獨立讀取器驗證。

                                          • diff --git a/web/public/zh-hant/presets/empty-and-minimal/index.html b/web/public/zh-hant/presets/empty-and-minimal/index.html index 080bb41a..d2840486 100644 --- a/web/public/zh-hant/presets/empty-and-minimal/index.html +++ b/web/public/zh-hant/presets/empty-and-minimal/index.html @@ -5,7 +5,7 @@ 各格式最小的合法檔案與空檔案 - + @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -177,10 +177,10 @@

                                            組合裡有什麼?

                                            - - - - + + + +
                                            檔案數30
                                            其配方中的 target 數30
                                            總大小39 263 B
                                            格式avif, bmp, csv, docx, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                            檔案數31
                                            其配方中的 target 數31
                                            總大小40 138 B
                                            格式avif, bmp, csv, docx, geojson, gif, html, ico, jpg, json, jxl, log, md, mp4, pdf, png, pptx, svg, targz, tiff, toml, txt, wav, webm, webp, xlsx, xml, yaml, zip
                                            @@ -191,7 +191,7 @@

                                            組合裡有什麼?

                                            預期意義檔案數 - accept你的系統應該接受這個檔案。28 + accept你的系統應該接受這個檔案。29 unspecified取決於你的系統規則。由你決定,然後檢查實際發生的是否符合你的本意。2 diff --git a/web/social-preview.sha256 b/web/social-preview.sha256 index 79d1762e..a50da7b6 100644 --- a/web/social-preview.sha256 +++ b/web/social-preview.sha256 @@ -1 +1 @@ -e049c19b8faa2c6b287c26d0b7f54a58922f4c2d68a8fcb20090501620aa16c5 +997f5b7071c1ea6b9daf72d4a1cf4bc1c52a44ddfe28b2c76771bcf3d2baac8d