summaryrefslogtreecommitdiff
path: root/spec/ruby/core/dir/children_spec.rb
blob: c6329b416f0632df0b60a9c1b68de1303eac887b (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
# encoding: utf-8

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

ruby_version_is "2.5" do
  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 ASCII-8BIT encoded.
      children = Dir.children(File.join(DirSpecs.mock_dir, 'special')).sort
      encoding = Encoding.find("filesystem")
      encoding = Encoding::ASCII_8BIT 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 diretory" do
      lambda { Dir.children DirSpecs.nonexistent }.should raise_error(SystemCallError)
    end
  end
end

ruby_version_is "2.6" do
  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 options Hash" do
      @dir = Dir.new("#{DirSpecs.mock_dir}/deeply/nested", encoding: "utf-8")
      a = @dir.children.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 ASCII-8BIT encoded.
      @dir = Dir.new(File.join(DirSpecs.mock_dir, 'special'))
      children = @dir.children.sort
      encoding = Encoding.find("filesystem")
      encoding = Encoding::ASCII_8BIT 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
end