summaryrefslogtreecommitdiff
path: root/spec/ruby/core/dir/children_spec.rb
blob: 986c8f38c02e7457c3e680bb0d6e9e3b6558c1b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# encoding: utf-8

require_relative '../../spec_helper'
require_relative 'fixtures/common'

describe "Dir.children" do
  before :all do
    DirSpecs.create_mock_dirs
  end

  before :each do
    @internal = Encoding.default_internal
  end

  after :all do
    DirSpecs.delete_mock_dirs
  end

  after :each do
    Encoding.default_internal = @internal
  end

  it "returns an Array of filenames in an existing directory including dotfiles" do
    a = Dir.children(DirSpecs.mock_dir).sort

    a.should == DirSpecs.expected_paths - %w[. ..]

    a = Dir.children("#{DirSpecs.mock_dir}/deeply/nested").sort
    a.should == %w|.dotfile.ext directory|
  end

  it "calls #to_path on non-String arguments" do
    p = mock('path')
    p.should_receive(:to_path).and_return(DirSpecs.mock_dir)
    Dir.children(p)
  end

  it "accepts an options Hash" do
    a = Dir.children("#{DirSpecs.mock_dir}/deeply/nested", encoding: "utf-8").sort
    a.should == %w|.dotfile.ext directory|
  end

  it "returns children encoded with the filesystem encoding by default" do
    # This spec depends on the locale not being US-ASCII because if it is, the
    # children that are not ascii_only? will be BINARY encoded.
    children = Dir.children(File.join(DirSpecs.mock_dir, 'special')).sort
    encoding = Encoding.find("filesystem")
    encoding = Encoding::BINARY if encoding == Encoding::US_ASCII
    platform_is_not :windows do
      children.should include("こんにちは.txt".force_encoding(encoding))
    end
    children.first.encoding.should equal(Encoding.find("filesystem"))
  end

  it "returns children encoded with the specified encoding" do
    dir = File.join(DirSpecs.mock_dir, 'special')
    children = Dir.children(dir, encoding: "euc-jp").sort
    children.first.encoding.should equal(Encoding::EUC_JP)
  end

  it "returns children transcoded to the default internal encoding" do
    Encoding.default_internal = Encoding::EUC_KR
    children = Dir.children(File.join(DirSpecs.mock_dir, 'special')).sort
    children.first.encoding.should equal(Encoding::EUC_KR)
  end

  it "raises a SystemCallError if called with a nonexistent directory" do
    -> { Dir.children DirSpecs.nonexistent }.should raise_error(SystemCallError)
  end
end

describe "Dir#children" do
  before :all do
    DirSpecs.create_mock_dirs
  end

  before :each do
    @internal = Encoding.default_internal
  end

  after :all do
    DirSpecs.delete_mock_dirs
  end

  after :each do
    Encoding.default_internal = @internal
    @dir.close if @dir
  end

  it "returns an Array of filenames in an existing directory including dotfiles" do
    @dir = Dir.new(DirSpecs.mock_dir)
    a = @dir.children.sort
    @dir.close

    a.should == DirSpecs.expected_paths - %w[. ..]

    @dir = Dir.new("#{DirSpecs.mock_dir}/deeply/nested")
    a = @dir.children.sort
    a.should == %w|.dotfile.ext directory|
  end

  it "accepts an encoding keyword for the encoding of the entries" do
    @dir = Dir.new("#{DirSpecs.mock_dir}/deeply/nested", encoding: "utf-8")
    dirs = @dir.to_a.sort
    dirs.each { |d| d.encoding.should == Encoding::UTF_8 }
  end

  ruby_version_is ""..."2.7" do
    it "accepts nil options" do
      @dir = Dir.new("#{DirSpecs.mock_dir}/deeply/nested", nil)
      dirs = @dir.to_a.sort
      dirs.each { |d| d.encoding.should == Encoding.find("filesystem") }
    end
  end

  it "returns children encoded with the filesystem encoding by default" do
    # This spec depends on the locale not being US-ASCII because if it is, the
    # children that are not ascii_only? will be BINARY encoded.
    @dir = Dir.new(File.join(DirSpecs.mock_dir, 'special'))
    children = @dir.children.sort
    encoding = Encoding.find("filesystem")
    encoding = Encoding::BINARY if encoding == Encoding::US_ASCII
    platform_is_not :windows do
      children.should include("こんにちは.txt".force_encoding(encoding))
    end
    children.first.encoding.should equal(Encoding.find("filesystem"))
  end

  it "returns children encoded with the specified encoding" do
    path = File.join(DirSpecs.mock_dir, 'special')
    @dir = Dir.new(path, encoding: "euc-jp")
    children = @dir.children.sort
    children.first.encoding.should equal(Encoding::EUC_JP)
  end

  it "returns children transcoded to the default internal encoding" do
    Encoding.default_internal = Encoding::EUC_KR
    @dir = Dir.new(File.join(DirSpecs.mock_dir, 'special'))
    children = @dir.children.sort
    children.first.encoding.should equal(Encoding::EUC_KR)
  end
end