diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ddad6c..9f72e1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ folgen [Semantic Versioning](https://semver.org/lang/de/). Die Version steht in ## [Unveröffentlicht] +### Behoben +- `record 0`, `record -1` und `record abc` lieferten Zeilen vom Ende der Tabelle (negativer Index in Ruby). Jetzt ein Fehler; eine Nummer hinter dem Ende gibt weiterhin eine leere Tabelle. + ### Hinzugefügt - Steuertabellen 2026 für `tax`: `demo/taxDE2026`, `taxAT2026`, `taxCH2026` (nur Bundessteuer), `taxLI2026` (nur Landessteuer), erzeugt mit `tools/gen_tax_tables.rb`, mit Tests. diff --git a/lib/rdb/cmd/relational.rb b/lib/rdb/cmd/relational.rb index 66bf849..b5aa12a 100644 --- a/lib/rdb/cmd/relational.rb +++ b/lib/rdb/cmd/relational.rb @@ -72,6 +72,8 @@ end Rdb.register('record', 'Find and output a record from a table', 'record number < table') do |args| die 'usage: record number < table' unless args.size == 1 + die "'#{args[0]}' is not a record number (1, 2, 3 ...)" unless args[0].match?(/\A\d+\z/) && args[0].to_i.positive? + t = table_in row = t.rows[args[0].to_i - 1] t.with(rows: row ? [row] : []).write diff --git a/test/rdb_test.rb b/test/rdb_test.rb index d3b4c24..95fdf50 100644 --- a/test/rdb_test.rb +++ b/test/rdb_test.rb @@ -5,6 +5,20 @@ require 'pty' require_relative '../lib/rdb' class SelectionTest < RdbCase + def test_record_rejects_numbers_below_one_and_junk + %w[0 -1 abc 2.5].each do |n| + out, err, st = run3('record', n, stdin: File.read(File.join(@dir, 'owners'))) + refute st.success?, "record #{n} should fail" + assert_equal '', out + assert_match(/not a record number/, err) + end + end + + def test_record_beyond_the_end_is_an_empty_table + assert_equal [], data(rdb('record', '9', file: 'owners')) + assert_equal [%w[6 cy]], data(rdb('record', '3', file: 'owners')) + end + def test_row_numeric_condition out = rdb('row', 'Cost > 5', file: 'inventory') assert_equal %w[3 6 7], data(out).map(&:first)