1#!/usr/bin/env ruby -w
2# encoding: UTF-8
3
4# tc_csv_writing.rb
5#
6#  Created by James Edward Gray II on 2005-10-31.
7#  Copyright 2005 James Edward Gray II. You can redistribute or modify this code
8#  under the terms of Ruby's license.
9
10require_relative "base"
11
12class TestCSV::Writing < TestCSV
13  extend DifferentOFS
14
15  def test_writing
16    [ ["\t",                      ["\t"]],
17      ["foo,\"\"\"\"\"\",baz",    ["foo", "\"\"", "baz"]],
18      ["foo,\"\"\"bar\"\"\",baz", ["foo", "\"bar\"", "baz"]],
19      ["\"\"\"\n\",\"\"\"\n\"",   ["\"\n", "\"\n"]],
20      ["foo,\"\r\n\",baz",        ["foo", "\r\n", "baz"]],
21      ["\"\"",                    [""]],
22      ["foo,\"\"\"\",baz",        ["foo", "\"", "baz"]],
23      ["foo,\"\r.\n\",baz",       ["foo", "\r.\n", "baz"]],
24      ["foo,\"\r\",baz",          ["foo", "\r", "baz"]],
25      ["foo,\"\",baz",            ["foo", "", "baz"]],
26      ["\",\"",                   [","]],
27      ["foo",                     ["foo"]],
28      [",,",                      [nil, nil, nil]],
29      [",",                       [nil, nil]],
30      ["foo,\"\n\",baz",          ["foo", "\n", "baz"]],
31      ["foo,,baz",                ["foo", nil, "baz"]],
32      ["\"\"\"\r\",\"\"\"\r\"",   ["\"\r", "\"\r"]],
33      ["\",\",\",\"",             [",", ","]],
34      ["foo,bar,",                ["foo", "bar", nil]],
35      [",foo,bar",                [nil, "foo", "bar"]],
36      ["foo,bar",                 ["foo", "bar"]],
37      [";",                       [";"]],
38      ["\t,\t",                   ["\t", "\t"]],
39      ["foo,\"\r\n\r\",baz",      ["foo", "\r\n\r", "baz"]],
40      ["foo,\"\r\n\n\",baz",      ["foo", "\r\n\n", "baz"]],
41      ["foo,\"foo,bar\",baz",     ["foo", "foo,bar", "baz"]],
42      [";,;",                     [";", ";"]],
43      ["foo,\"\"\"\"\"\",baz",    ["foo", "\"\"", "baz"]],
44      ["foo,\"\"\"bar\"\"\",baz", ["foo", "\"bar\"", "baz"]],
45      ["foo,\"\r\n\",baz",        ["foo", "\r\n", "baz"]],
46      ["\"\"",                    [""]],
47      ["foo,\"\"\"\",baz",        ["foo", "\"", "baz"]],
48      ["foo,\"\r.\n\",baz",       ["foo", "\r.\n", "baz"]],
49      ["foo,\"\r\",baz",          ["foo", "\r", "baz"]],
50      ["foo,\"\",baz",            ["foo", "", "baz"]],
51      ["foo",                     ["foo"]],
52      [",,",                      [nil, nil, nil]],
53      [",",                       [nil, nil]],
54      ["foo,\"\n\",baz",          ["foo", "\n", "baz"]],
55      ["foo,,baz",                ["foo", nil, "baz"]],
56      ["foo,bar",                 ["foo", "bar"]],
57      ["foo,\"\r\n\n\",baz",      ["foo", "\r\n\n", "baz"]],
58      ["foo,\"foo,bar\",baz",     ["foo", "foo,bar", "baz"]],
59      [%Q{a,b},                   ["a", "b"]],
60      [%Q{a,"""b"""},             ["a", "\"b\""]],
61      [%Q{a,"""b"},               ["a", "\"b"]],
62      [%Q{a,"b"""},               ["a", "b\""]],
63      [%Q{a,"\nb"""},             ["a", "\nb\""]],
64      [%Q{a,"""\nb"},             ["a", "\"\nb"]],
65      [%Q{a,"""\nb\n"""},         ["a", "\"\nb\n\""]],
66      [%Q{a,"""\nb\n""",},        ["a", "\"\nb\n\"", nil]],
67      [%Q{a,,,},                  ["a", nil, nil, nil]],
68      [%Q{,},                     [nil, nil]],
69      [%Q{"",""},                 ["", ""]],
70      [%Q{""""},                  ["\""]],
71      [%Q{"""",""},               ["\"",""]],
72      [%Q{,""},                   [nil,""]],
73      [%Q{,"\r"},                 [nil,"\r"]],
74      [%Q{"\r\n,"},               ["\r\n,"]],
75      [%Q{"\r\n,",},              ["\r\n,", nil]] ].each do |test_case|
76        assert_equal(test_case.first + $/, CSV.generate_line(test_case.last))
77      end
78  end
79
80  def test_col_sep
81    assert_equal( "a;b;;c\n", CSV.generate_line( ["a", "b", nil, "c"],
82                                                 col_sep: ";" ) )
83    assert_equal( "a\tb\t\tc\n", CSV.generate_line( ["a", "b", nil, "c"],
84                                                    col_sep: "\t" ) )
85  end
86
87  def test_row_sep
88    assert_equal( "a,b,,c\r\n", CSV.generate_line( ["a", "b", nil, "c"],
89                                                   row_sep: "\r\n" ) )
90  end
91
92  def test_force_quotes
93    assert_equal( %Q{"1","b","","already ""quoted"""\n},
94                  CSV.generate_line( [1, "b", nil, %Q{already "quoted"}],
95                                     force_quotes: true ) )
96  end
97end
98