tb 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/README +156 -5
  2. data/bin/tb +2 -1110
  3. data/lib/tb.rb +4 -2
  4. data/lib/tb/catreader.rb +131 -0
  5. data/lib/tb/cmd_cat.rb +65 -0
  6. data/lib/tb/cmd_consecutive.rb +79 -0
  7. data/lib/tb/cmd_crop.rb +105 -0
  8. data/lib/tb/cmd_cross.rb +119 -0
  9. data/lib/tb/cmd_csv.rb +42 -0
  10. data/lib/tb/cmd_cut.rb +77 -0
  11. data/lib/tb/cmd_grep.rb +76 -0
  12. data/lib/tb/cmd_group.rb +82 -0
  13. data/lib/tb/cmd_gsub.rb +77 -0
  14. data/lib/tb/cmd_help.rb +98 -0
  15. data/lib/tb/cmd_join.rb +81 -0
  16. data/lib/tb/cmd_json.rb +60 -0
  17. data/lib/tb/cmd_ls.rb +273 -0
  18. data/lib/tb/cmd_mheader.rb +77 -0
  19. data/lib/tb/cmd_newfield.rb +59 -0
  20. data/lib/tb/cmd_pnm.rb +43 -0
  21. data/lib/tb/cmd_pp.rb +70 -0
  22. data/lib/tb/cmd_rename.rb +58 -0
  23. data/lib/tb/cmd_shape.rb +67 -0
  24. data/lib/tb/cmd_sort.rb +58 -0
  25. data/lib/tb/cmd_svn_log.rb +158 -0
  26. data/lib/tb/cmd_tsv.rb +43 -0
  27. data/lib/tb/cmd_yaml.rb +47 -0
  28. data/lib/tb/cmdmain.rb +45 -0
  29. data/lib/tb/cmdtop.rb +58 -0
  30. data/lib/tb/cmdutil.rb +327 -0
  31. data/lib/tb/csv.rb +30 -6
  32. data/lib/tb/fieldset.rb +39 -41
  33. data/lib/tb/pager.rb +132 -0
  34. data/lib/tb/pnm.rb +357 -0
  35. data/lib/tb/reader.rb +18 -128
  36. data/lib/tb/record.rb +3 -3
  37. data/lib/tb/ropen.rb +70 -0
  38. data/lib/tb/{pathfinder.rb → search.rb} +69 -34
  39. data/lib/tb/tsv.rb +29 -1
  40. data/sample/colors.ppm +0 -0
  41. data/sample/gradation.pgm +0 -0
  42. data/sample/langs.csv +46 -0
  43. data/sample/tbplot +293 -0
  44. data/test-all-cov.rb +65 -0
  45. data/test-all.rb +5 -0
  46. data/test/test_basic.rb +99 -2
  47. data/test/test_catreader.rb +27 -0
  48. data/test/test_cmd_cat.rb +118 -0
  49. data/test/test_cmd_consecutive.rb +90 -0
  50. data/test/test_cmd_crop.rb +101 -0
  51. data/test/test_cmd_cross.rb +113 -0
  52. data/test/test_cmd_csv.rb +129 -0
  53. data/test/test_cmd_cut.rb +100 -0
  54. data/test/test_cmd_grep.rb +89 -0
  55. data/test/test_cmd_group.rb +181 -0
  56. data/test/test_cmd_gsub.rb +103 -0
  57. data/test/test_cmd_help.rb +190 -0
  58. data/test/test_cmd_join.rb +197 -0
  59. data/test/test_cmd_json.rb +75 -0
  60. data/test/test_cmd_ls.rb +203 -0
  61. data/test/test_cmd_mheader.rb +86 -0
  62. data/test/test_cmd_newfield.rb +63 -0
  63. data/test/test_cmd_pnm.rb +35 -0
  64. data/test/test_cmd_pp.rb +62 -0
  65. data/test/test_cmd_rename.rb +91 -0
  66. data/test/test_cmd_shape.rb +50 -0
  67. data/test/test_cmd_sort.rb +105 -0
  68. data/test/test_cmd_tsv.rb +67 -0
  69. data/test/test_cmd_yaml.rb +55 -0
  70. data/test/test_cmdtty.rb +154 -0
  71. data/test/test_cmdutil.rb +43 -0
  72. data/test/test_csv.rb +10 -0
  73. data/test/test_fieldset.rb +42 -0
  74. data/test/test_pager.rb +142 -0
  75. data/test/test_pnm.rb +374 -0
  76. data/test/test_reader.rb +147 -0
  77. data/test/test_record.rb +49 -0
  78. data/test/test_search.rb +575 -0
  79. data/test/test_tsv.rb +7 -0
  80. metadata +108 -5
  81. data/lib/tb/qtsv.rb +0 -93
@@ -0,0 +1,62 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdPP < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b,c
21
+ 0,1,2
22
+ 4,5,6
23
+ End
24
+ Tb::Cmd.main_pp(['-o', o="o.pp", i])
25
+ assert_equal(<<-"End".gsub(/\s/, ''), File.read(o).gsub(/\s/, ''))
26
+ { "a" => "0", "b" => "1", "c" => "2" }
27
+ { "a" => "4", "b" => "5", "c" => "6" }
28
+ End
29
+ end
30
+
31
+ def test_extend
32
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
33
+ a,b
34
+ 0,1,2,3
35
+ End
36
+ Tb::Cmd.main_pp(['-o', o="o.pp", i])
37
+ assert_equal(<<-"End".gsub(/\s/, ''), File.read(o).gsub(/\s/, ''))
38
+ { "a" => "0", "b" => "1", "1" => "2", "2" => "3" }
39
+ End
40
+ end
41
+
42
+ def test_twofile
43
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
44
+ a,b
45
+ 1,2
46
+ 3,4
47
+ End
48
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
49
+ b,a
50
+ 5,6
51
+ 7,8
52
+ End
53
+ Tb::Cmd.main_pp(['-o', o="o.csv", i1, i2])
54
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
55
+ {"a"=>"1", "b"=>"2"}
56
+ {"a"=>"3", "b"=>"4"}
57
+ {"b"=>"5", "a"=>"6"}
58
+ {"b"=>"7", "a"=>"8"}
59
+ End
60
+ end
61
+
62
+ end
@@ -0,0 +1,91 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdRename < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b,c,d
21
+ 0,1,2,3
22
+ 4,5,6,7
23
+ 8,9,a,b
24
+ c,d,e,f
25
+ End
26
+ Tb::Cmd.main_rename(['-o', o="o.csv", 'b,x,c,b', i])
27
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
28
+ a,x,b,d
29
+ 0,1,2,3
30
+ 4,5,6,7
31
+ 8,9,a,b
32
+ c,d,e,f
33
+ End
34
+ end
35
+
36
+ def test_no_rename_fields
37
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_rename([]) }
38
+ assert(!exc.success?)
39
+ end
40
+
41
+ def test_empty
42
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
43
+ a,b,c,d
44
+ 0,1,2,3
45
+ 4,5,6,7
46
+ 8,9,a,b
47
+ c,d,e,f
48
+ End
49
+ Tb::Cmd.main_rename(['-o', o="o.csv", '', i])
50
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
51
+ a,b,c,d
52
+ 0,1,2,3
53
+ 4,5,6,7
54
+ 8,9,a,b
55
+ c,d,e,f
56
+ End
57
+ end
58
+
59
+ def test_twofile
60
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
61
+ a,b
62
+ 1,2
63
+ 3,4
64
+ End
65
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
66
+ b,a
67
+ 5,6
68
+ 7,8
69
+ End
70
+ Tb::Cmd.main_rename(['-o', o="o.csv", 'a,c', i1, i2])
71
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
72
+ c,b
73
+ 1,2
74
+ 3,4
75
+ 6,5
76
+ 8,7
77
+ End
78
+ end
79
+
80
+ def test_field_not_found
81
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
82
+ a,b
83
+ 1,2
84
+ 3,4
85
+ End
86
+ exc = assert_raise(SystemExit) { Tb::Cmd.main_rename(['-o', "o.csv", 'z,c', i]) }
87
+ assert(!exc.success?)
88
+ assert_match(/field not found/, exc.message)
89
+ end
90
+
91
+ end
@@ -0,0 +1,50 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdShape < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b,c
21
+ 0,1
22
+ 4,5,6,7
23
+ End
24
+ Tb::Cmd.main_shape(['-o', o="o.csv", i])
25
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
26
+ header_fields,min_fields,max_fields,records,filename
27
+ 3,2,4,2,i.csv
28
+ End
29
+ end
30
+
31
+ def test_twofile
32
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
33
+ a
34
+ 1
35
+ 3
36
+ End
37
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
38
+ b,a
39
+ 5,6
40
+ 7,8
41
+ End
42
+ Tb::Cmd.main_shape(['-o', o="o.csv", i1, i2])
43
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
44
+ header_fields,min_fields,max_fields,records,filename
45
+ 1,1,1,2,i1.csv
46
+ 2,2,2,2,i2.csv
47
+ End
48
+ end
49
+
50
+ end
@@ -0,0 +1,105 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdSort < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b
21
+ 1,4
22
+ 0,3
23
+ 3,2
24
+ End
25
+ Tb::Cmd.main_sort(['-o', o="o.csv", i])
26
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
27
+ a,b
28
+ 0,3
29
+ 1,4
30
+ 3,2
31
+ End
32
+ end
33
+
34
+ def test_numeric
35
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
36
+ a,b
37
+ 1,4
38
+ 0,3
39
+ 3,2
40
+ End
41
+ Tb::Cmd.main_sort(['-o', o="o.csv", '-N', i])
42
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
43
+ 0,3
44
+ 1,4
45
+ 3,2
46
+ a,b
47
+ End
48
+ end
49
+
50
+ def test_opt_f
51
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
52
+ a,b
53
+ 1,4
54
+ 0,3
55
+ 3,2
56
+ End
57
+ Tb::Cmd.main_sort(['-o', o="o.csv", '-f', 'b', i])
58
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
59
+ a,b
60
+ 3,2
61
+ 0,3
62
+ 1,4
63
+ End
64
+ end
65
+
66
+ def test_cmp
67
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
68
+ a,b,c
69
+ 10,a20b0,11
70
+ 1,2e1,3
71
+ 4,,6
72
+ 7,8,9
73
+ End
74
+ Tb::Cmd.main_sort(['-o', o="o.csv", '-f', 'b', i])
75
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
76
+ a,b,c
77
+ 4,,6
78
+ 7,8,9
79
+ 1,2e1,3
80
+ 10,a20b0,11
81
+ End
82
+ end
83
+
84
+ def test_twofile
85
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
86
+ a,b
87
+ 1,2
88
+ 3,4
89
+ End
90
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
91
+ b,a
92
+ 5,0
93
+ 7,8
94
+ End
95
+ Tb::Cmd.main_sort(['-o', o="o.csv", i1, i2])
96
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
97
+ a,b
98
+ 0,5
99
+ 1,2
100
+ 3,4
101
+ 8,7
102
+ End
103
+ end
104
+
105
+ end
@@ -0,0 +1,67 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdTSV < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b,c
21
+ 0,1,2
22
+ 4,5,6
23
+ End
24
+ Tb::Cmd.main_tsv(['-o', o="o.tsv", i])
25
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
26
+ a\tb\tc
27
+ 0\t1\t2
28
+ 4\t5\t6
29
+ End
30
+ end
31
+
32
+ def test_numeric
33
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
34
+ a,b,c
35
+ 0,1,2
36
+ 4,5,6
37
+ End
38
+ Tb::Cmd.main_tsv(['-o', o="o.tsv", '-N', i])
39
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
40
+ a\tb\tc
41
+ 0\t1\t2
42
+ 4\t5\t6
43
+ End
44
+ end
45
+
46
+ def test_twofile
47
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
48
+ a,b
49
+ 1,2
50
+ 3,4
51
+ End
52
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
53
+ b,a
54
+ 5,6
55
+ 7,8
56
+ End
57
+ Tb::Cmd.main_tsv(['-o', o="o.csv", i1, i2])
58
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), File.read(o))
59
+ a\tb
60
+ 1\t2
61
+ 3\t4
62
+ 6\t5
63
+ 8\t7
64
+ End
65
+ end
66
+
67
+ end
@@ -0,0 +1,55 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+
5
+ class TestTbCmdYAML < Test::Unit::TestCase
6
+ def setup
7
+ Tb::Cmd.reset_option
8
+ @curdir = Dir.pwd
9
+ @tmpdir = Dir.mktmpdir
10
+ Dir.chdir @tmpdir
11
+ end
12
+ def teardown
13
+ Tb::Cmd.reset_option
14
+ Dir.chdir @curdir
15
+ FileUtils.rmtree @tmpdir
16
+ end
17
+
18
+ def test_basic
19
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
20
+ a,b,c
21
+ 0,1,2
22
+ 4,5,6
23
+ End
24
+ Tb::Cmd.main_yaml(['-o', o="o.yaml", i])
25
+ assert_equal(
26
+ [
27
+ {'a' => '0', 'b' => '1', 'c' => '2'},
28
+ {'a' => '4', 'b' => '5', 'c' => '6'},
29
+ ],
30
+ YAML.load(File.read(o)))
31
+ end
32
+
33
+ def test_twofile
34
+ File.open(i1="i1.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
35
+ a,b
36
+ 1,2
37
+ 3,4
38
+ End
39
+ File.open(i2="i2.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
40
+ b,a
41
+ 5,6
42
+ 7,8
43
+ End
44
+ Tb::Cmd.main_yaml(['-o', o="o.csv", i1, i2])
45
+ assert_equal(
46
+ [
47
+ {'a' => '1', 'b' => '2'},
48
+ {'a' => '3', 'b' => '4'},
49
+ {'a' => '6', 'b' => '5'},
50
+ {'a' => '8', 'b' => '7'},
51
+ ],
52
+ YAML.load(File.read(o)))
53
+ end
54
+
55
+ end
@@ -0,0 +1,154 @@
1
+ require 'test/unit'
2
+ require 'tb/cmdtop'
3
+ require 'tmpdir'
4
+ begin
5
+ require 'pty'
6
+ require 'io/console'
7
+ rescue LoadError
8
+ end
9
+
10
+ class TestTbCmdTTY < Test::Unit::TestCase
11
+ def setup
12
+ Tb::Cmd.reset_option
13
+ @curdir = Dir.pwd
14
+ @tmpdir = Dir.mktmpdir
15
+ Dir.chdir @tmpdir
16
+ end
17
+ def teardown
18
+ Tb::Cmd.reset_option
19
+ Dir.chdir @curdir
20
+ FileUtils.rmtree @tmpdir
21
+ end
22
+
23
+ def with_env(k, v)
24
+ save = ENV[k]
25
+ begin
26
+ ENV[k] = v
27
+ yield
28
+ ensure
29
+ ENV[k] = save
30
+ end
31
+ end
32
+
33
+ def with_stdout(io)
34
+ save = STDOUT.dup
35
+ STDOUT.reopen(io)
36
+ begin
37
+ yield
38
+ ensure
39
+ STDOUT.reopen(save)
40
+ save.close
41
+ end
42
+ end
43
+
44
+ def reader_thread(io)
45
+ Thread.new {
46
+ r = ''
47
+ loop {
48
+ begin
49
+ r << io.readpartial(4096)
50
+ rescue EOFError, Errno::EIO
51
+ break
52
+ end
53
+ }
54
+ r
55
+ }
56
+ end
57
+
58
+ def test_ttyout_multiscreen
59
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
60
+ a,b,c
61
+ 0,1,2
62
+ 4,5,6
63
+ End
64
+ with_env('PAGER', 'sed "s/^/foo:/"') {
65
+ PTY.open {|m, s|
66
+ s.raw!
67
+ s.winsize = [2, 80]
68
+ th = reader_thread(m)
69
+ with_stdout(s) {
70
+ Tb::Cmd.main_csv([i])
71
+ }
72
+ s.close
73
+ result = th.value
74
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
75
+ foo:a,b,c
76
+ foo:0,1,2
77
+ foo:4,5,6
78
+ End
79
+ }
80
+ }
81
+ end
82
+
83
+ def test_ttyout_singlescreen
84
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
85
+ a,b,c
86
+ 0,1,2
87
+ 4,5,6
88
+ End
89
+ with_env('PAGER', 'sed "s/^/foo:/"') {
90
+ PTY.open {|m, s|
91
+ s.raw!
92
+ s.winsize = [24, 80]
93
+ th = reader_thread(m)
94
+ with_stdout(s) {
95
+ Tb::Cmd.main_csv([i])
96
+ }
97
+ s.close
98
+ result = th.value
99
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
100
+ a,b,c
101
+ 0,1,2
102
+ 4,5,6
103
+ End
104
+ }
105
+ }
106
+ end
107
+
108
+ def test_ttyout_tab
109
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
110
+ a,b,c
111
+ 0,\t,2
112
+ End
113
+ with_env('PAGER', 'sed "s/^/foo:/"') {
114
+ PTY.open {|m, s|
115
+ s.raw!
116
+ s.winsize = [3, 10]
117
+ th = reader_thread(m)
118
+ with_stdout(s) {
119
+ Tb::Cmd.main_csv([i])
120
+ }
121
+ s.close
122
+ result = th.value
123
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
124
+ foo:a,b,c
125
+ foo:0,\t,2
126
+ End
127
+ }
128
+ }
129
+ end
130
+
131
+ def test_ttyout_nottysize
132
+ File.open(i="i.csv", "w") {|f| f << <<-"End".gsub(/^[ \t]+/, '') }
133
+ a,b,c
134
+ 0,1,2
135
+ End
136
+ with_env('PAGER', 'sed "s/^/foo:/"') {
137
+ PTY.open {|m, s|
138
+ s.raw!
139
+ s.winsize = [0, 0]
140
+ th = reader_thread(m)
141
+ with_stdout(s) {
142
+ Tb::Cmd.main_csv([i])
143
+ }
144
+ s.close
145
+ result = th.value
146
+ assert_equal(<<-"End".gsub(/^[ \t]+/, ''), result)
147
+ a,b,c
148
+ 0,1,2
149
+ End
150
+ }
151
+ }
152
+ end
153
+
154
+ end if defined?(PTY) && defined?(PTY.open)