PageRenderTime 29ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.8/pathname/test_pathname.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 487 lines | 416 code | 69 blank | 2 comment | 22 complexity | 737e31c0518b3d9b5d046ed68a63b70e MD5 | raw file
  1. #!/usr/bin/env ruby
  2. require 'test/unit'
  3. require 'pathname'
  4. require 'fileutils'
  5. require 'tmpdir'
  6. require 'enumerator'
  7. class TestPathname < Test::Unit::TestCase
  8. def self.define_assertion(name, &block)
  9. @defassert_num ||= {}
  10. @defassert_num[name] ||= 0
  11. @defassert_num[name] += 1
  12. define_method("test_#{name}_#{@defassert_num[name]}", &block)
  13. end
  14. def self.defassert(name, result, *args)
  15. define_assertion(name) {
  16. assert_equal(result, self.send(name, *args), "#{name}(#{args.map {|a| a.inspect }.join(', ')})")
  17. }
  18. end
  19. DOSISH = File::ALT_SEPARATOR != nil
  20. DOSISH_DRIVE_LETTER = File.dirname("A:") == "A:."
  21. DOSISH_UNC = File.dirname("//") == "//"
  22. def cleanpath_aggressive(path)
  23. Pathname.new(path).cleanpath.to_s
  24. end
  25. defassert(:cleanpath_aggressive, '/', '/')
  26. defassert(:cleanpath_aggressive, '.', '')
  27. defassert(:cleanpath_aggressive, '.', '.')
  28. defassert(:cleanpath_aggressive, '..', '..')
  29. defassert(:cleanpath_aggressive, 'a', 'a')
  30. defassert(:cleanpath_aggressive, '/', '/.')
  31. defassert(:cleanpath_aggressive, '/', '/..')
  32. defassert(:cleanpath_aggressive, '/a', '/a')
  33. defassert(:cleanpath_aggressive, '.', './')
  34. defassert(:cleanpath_aggressive, '..', '../')
  35. defassert(:cleanpath_aggressive, 'a', 'a/')
  36. defassert(:cleanpath_aggressive, 'a/b', 'a//b')
  37. defassert(:cleanpath_aggressive, 'a', 'a/.')
  38. defassert(:cleanpath_aggressive, 'a', 'a/./')
  39. defassert(:cleanpath_aggressive, '.', 'a/..')
  40. defassert(:cleanpath_aggressive, '.', 'a/../')
  41. defassert(:cleanpath_aggressive, '/a', '/a/.')
  42. defassert(:cleanpath_aggressive, '..', './..')
  43. defassert(:cleanpath_aggressive, '..', '../.')
  44. defassert(:cleanpath_aggressive, '..', './../')
  45. defassert(:cleanpath_aggressive, '..', '.././')
  46. defassert(:cleanpath_aggressive, '/', '/./..')
  47. defassert(:cleanpath_aggressive, '/', '/../.')
  48. defassert(:cleanpath_aggressive, '/', '/./../')
  49. defassert(:cleanpath_aggressive, '/', '/.././')
  50. defassert(:cleanpath_aggressive, 'a/b/c', 'a/b/c')
  51. defassert(:cleanpath_aggressive, 'b/c', './b/c')
  52. defassert(:cleanpath_aggressive, 'a/c', 'a/./c')
  53. defassert(:cleanpath_aggressive, 'a/b', 'a/b/.')
  54. defassert(:cleanpath_aggressive, '.', 'a/../.')
  55. defassert(:cleanpath_aggressive, '/a', '/../.././../a')
  56. defassert(:cleanpath_aggressive, '../../d', 'a/b/../../../../c/../d')
  57. if DOSISH_UNC
  58. defassert(:cleanpath_aggressive, '//a/b/c', '//a/b/c/')
  59. else
  60. defassert(:cleanpath_aggressive, '/', '///')
  61. defassert(:cleanpath_aggressive, '/a', '///a')
  62. defassert(:cleanpath_aggressive, '/', '///..')
  63. defassert(:cleanpath_aggressive, '/', '///.')
  64. defassert(:cleanpath_aggressive, '/', '///a/../..')
  65. end
  66. def cleanpath_conservative(path)
  67. Pathname.new(path).cleanpath(true).to_s
  68. end
  69. defassert(:cleanpath_conservative, '/', '/')
  70. defassert(:cleanpath_conservative, '.', '')
  71. defassert(:cleanpath_conservative, '.', '.')
  72. defassert(:cleanpath_conservative, '..', '..')
  73. defassert(:cleanpath_conservative, 'a', 'a')
  74. defassert(:cleanpath_conservative, '/', '/.')
  75. defassert(:cleanpath_conservative, '/', '/..')
  76. defassert(:cleanpath_conservative, '/a', '/a')
  77. defassert(:cleanpath_conservative, '.', './')
  78. defassert(:cleanpath_conservative, '..', '../')
  79. defassert(:cleanpath_conservative, 'a/', 'a/')
  80. defassert(:cleanpath_conservative, 'a/b', 'a//b')
  81. defassert(:cleanpath_conservative, 'a/.', 'a/.')
  82. defassert(:cleanpath_conservative, 'a/.', 'a/./')
  83. defassert(:cleanpath_conservative, 'a/..', 'a/../')
  84. defassert(:cleanpath_conservative, '/a/.', '/a/.')
  85. defassert(:cleanpath_conservative, '..', './..')
  86. defassert(:cleanpath_conservative, '..', '../.')
  87. defassert(:cleanpath_conservative, '..', './../')
  88. defassert(:cleanpath_conservative, '..', '.././')
  89. defassert(:cleanpath_conservative, '/', '/./..')
  90. defassert(:cleanpath_conservative, '/', '/../.')
  91. defassert(:cleanpath_conservative, '/', '/./../')
  92. defassert(:cleanpath_conservative, '/', '/.././')
  93. defassert(:cleanpath_conservative, 'a/b/c', 'a/b/c')
  94. defassert(:cleanpath_conservative, 'b/c', './b/c')
  95. defassert(:cleanpath_conservative, 'a/c', 'a/./c')
  96. defassert(:cleanpath_conservative, 'a/b/.', 'a/b/.')
  97. defassert(:cleanpath_conservative, 'a/..', 'a/../.')
  98. defassert(:cleanpath_conservative, '/a', '/../.././../a')
  99. defassert(:cleanpath_conservative, 'a/b/../../../../c/../d', 'a/b/../../../../c/../d')
  100. if DOSISH_UNC
  101. defassert(:cleanpath_conservative, '//', '//')
  102. else
  103. defassert(:cleanpath_conservative, '/', '//')
  104. end
  105. # has_trailing_separator?(path) -> bool
  106. def has_trailing_separator?(path)
  107. Pathname.allocate.__send__(:has_trailing_separator?, path)
  108. end
  109. defassert(:has_trailing_separator?, false, "/")
  110. defassert(:has_trailing_separator?, false, "///")
  111. defassert(:has_trailing_separator?, false, "a")
  112. defassert(:has_trailing_separator?, true, "a/")
  113. def add_trailing_separator(path)
  114. Pathname.allocate.__send__(:add_trailing_separator, path)
  115. end
  116. def del_trailing_separator(path)
  117. Pathname.allocate.__send__(:del_trailing_separator, path)
  118. end
  119. defassert(:del_trailing_separator, "/", "/")
  120. defassert(:del_trailing_separator, "/a", "/a")
  121. defassert(:del_trailing_separator, "/a", "/a/")
  122. defassert(:del_trailing_separator, "/a", "/a//")
  123. defassert(:del_trailing_separator, ".", ".")
  124. defassert(:del_trailing_separator, ".", "./")
  125. defassert(:del_trailing_separator, ".", ".//")
  126. if DOSISH_DRIVE_LETTER
  127. defassert(:del_trailing_separator, "A:", "A:")
  128. defassert(:del_trailing_separator, "A:/", "A:/")
  129. defassert(:del_trailing_separator, "A:/", "A://")
  130. defassert(:del_trailing_separator, "A:.", "A:.")
  131. defassert(:del_trailing_separator, "A:.", "A:./")
  132. defassert(:del_trailing_separator, "A:.", "A:.//")
  133. end
  134. if DOSISH_UNC
  135. defassert(:del_trailing_separator, "//", "//")
  136. defassert(:del_trailing_separator, "//a", "//a")
  137. defassert(:del_trailing_separator, "//a", "//a/")
  138. defassert(:del_trailing_separator, "//a", "//a//")
  139. defassert(:del_trailing_separator, "//a/b", "//a/b")
  140. defassert(:del_trailing_separator, "//a/b", "//a/b/")
  141. defassert(:del_trailing_separator, "//a/b", "//a/b//")
  142. defassert(:del_trailing_separator, "//a/b/c", "//a/b/c")
  143. defassert(:del_trailing_separator, "//a/b/c", "//a/b/c/")
  144. defassert(:del_trailing_separator, "//a/b/c", "//a/b/c//")
  145. else
  146. defassert(:del_trailing_separator, "/", "///")
  147. defassert(:del_trailing_separator, "///a", "///a/")
  148. end
  149. if DOSISH
  150. defassert(:del_trailing_separator, "a", "a\\")
  151. require 'Win32API'
  152. if Win32API.new('kernel32', 'GetACP', nil, 'L').call == 932
  153. defassert(:del_trailing_separator, "\225\\", "\225\\\\") # SJIS
  154. end
  155. end
  156. def plus(path1, path2) # -> path
  157. (Pathname.new(path1) + Pathname.new(path2)).to_s
  158. end
  159. defassert(:plus, '/', '/', '/')
  160. defassert(:plus, 'a/b', 'a', 'b')
  161. defassert(:plus, 'a', 'a', '.')
  162. defassert(:plus, 'b', '.', 'b')
  163. defassert(:plus, '.', '.', '.')
  164. defassert(:plus, '/b', 'a', '/b')
  165. defassert(:plus, '/', '/', '..')
  166. defassert(:plus, '.', 'a', '..')
  167. defassert(:plus, 'a', 'a/b', '..')
  168. defassert(:plus, '../..', '..', '..')
  169. defassert(:plus, '/c', '/', '../c')
  170. defassert(:plus, 'c', 'a', '../c')
  171. defassert(:plus, 'a/c', 'a/b', '../c')
  172. defassert(:plus, '../../c', '..', '../c')
  173. defassert(:plus, 'a//b/d//e', 'a//b/c', '../d//e')
  174. def relative?(path)
  175. Pathname.new(path).relative?
  176. end
  177. defassert(:relative?, false, '/')
  178. defassert(:relative?, false, '/a')
  179. defassert(:relative?, false, '/..')
  180. defassert(:relative?, true, 'a')
  181. defassert(:relative?, true, 'a/b')
  182. if DOSISH_DRIVE_LETTER
  183. defassert(:relative?, false, 'A:')
  184. defassert(:relative?, false, 'A:/')
  185. defassert(:relative?, false, 'A:/a')
  186. end
  187. if File.dirname('//') == '//'
  188. defassert(:relative?, false, '//')
  189. defassert(:relative?, false, '//a')
  190. defassert(:relative?, false, '//a/')
  191. defassert(:relative?, false, '//a/b')
  192. defassert(:relative?, false, '//a/b/')
  193. defassert(:relative?, false, '//a/b/c')
  194. end
  195. def relative_path_from(dest_directory, base_directory)
  196. Pathname.new(dest_directory).relative_path_from(Pathname.new(base_directory)).to_s
  197. end
  198. defassert(:relative_path_from, "../a", "a", "b")
  199. defassert(:relative_path_from, "../a", "a", "b/")
  200. defassert(:relative_path_from, "../a", "a/", "b")
  201. defassert(:relative_path_from, "../a", "a/", "b/")
  202. defassert(:relative_path_from, "../a", "/a", "/b")
  203. defassert(:relative_path_from, "../a", "/a", "/b/")
  204. defassert(:relative_path_from, "../a", "/a/", "/b")
  205. defassert(:relative_path_from, "../a", "/a/", "/b/")
  206. defassert(:relative_path_from, "../b", "a/b", "a/c")
  207. defassert(:relative_path_from, "../a", "../a", "../b")
  208. defassert(:relative_path_from, "a", "a", ".")
  209. defassert(:relative_path_from, "..", ".", "a")
  210. defassert(:relative_path_from, ".", ".", ".")
  211. defassert(:relative_path_from, ".", "..", "..")
  212. defassert(:relative_path_from, "..", "..", ".")
  213. defassert(:relative_path_from, "c/d", "/a/b/c/d", "/a/b")
  214. defassert(:relative_path_from, "../..", "/a/b", "/a/b/c/d")
  215. defassert(:relative_path_from, "../../../../e", "/e", "/a/b/c/d")
  216. defassert(:relative_path_from, "../b/c", "a/b/c", "a/d")
  217. defassert(:relative_path_from, "../a", "/../a", "/b")
  218. defassert(:relative_path_from, "../../a", "../a", "b")
  219. defassert(:relative_path_from, ".", "/a/../../b", "/b")
  220. defassert(:relative_path_from, "..", "a/..", "a")
  221. defassert(:relative_path_from, ".", "a/../b", "b")
  222. defassert(:relative_path_from, "a", "a", "b/..")
  223. defassert(:relative_path_from, "b/c", "b/c", "b/..")
  224. def self.defassert_raise(name, exc, *args)
  225. define_assertion(name) {
  226. message = "#{name}(#{args.map {|a| a.inspect }.join(', ')})"
  227. assert_raise(exc, message) { self.send(name, *args) }
  228. }
  229. end
  230. defassert_raise(:relative_path_from, ArgumentError, "/", ".")
  231. defassert_raise(:relative_path_from, ArgumentError, ".", "/")
  232. defassert_raise(:relative_path_from, ArgumentError, "a", "..")
  233. defassert_raise(:relative_path_from, ArgumentError, ".", "..")
  234. def realpath(path)
  235. Pathname.new(path).realpath.to_s
  236. end
  237. def test_realpath
  238. begin
  239. File.symlink(nil, nil)
  240. rescue NotImplementedError
  241. return
  242. rescue TypeError
  243. end
  244. Dir.mktmpdir('rubytest-pathname') {|dir|
  245. File.symlink("not-exist-target", "#{dir}/not-exist")
  246. assert_raise(Errno::ENOENT) { realpath("#{dir}/not-exist") }
  247. File.symlink("loop", "#{dir}/loop")
  248. assert_raise(Errno::ELOOP) { realpath("#{dir}/loop") }
  249. }
  250. end
  251. def descend(path)
  252. Pathname.new(path).enum_for(:descend).map {|v| v.to_s }
  253. end
  254. defassert(:descend, %w[/ /a /a/b /a/b/c], "/a/b/c")
  255. defassert(:descend, %w[a a/b a/b/c], "a/b/c")
  256. defassert(:descend, %w[. ./a ./a/b ./a/b/c], "./a/b/c")
  257. defassert(:descend, %w[a/], "a/")
  258. def ascend(path)
  259. Pathname.new(path).enum_for(:ascend).map {|v| v.to_s }
  260. end
  261. defassert(:ascend, %w[/a/b/c /a/b /a /], "/a/b/c")
  262. defassert(:ascend, %w[a/b/c a/b a], "a/b/c")
  263. defassert(:ascend, %w[./a/b/c ./a/b ./a .], "./a/b/c")
  264. defassert(:ascend, %w[a/], "a/")
  265. def test_initialize
  266. p1 = Pathname.new('a')
  267. assert_equal('a', p1.to_s)
  268. p2 = Pathname.new(p1)
  269. assert_equal(p1, p2)
  270. end
  271. def test_initialize_nul
  272. assert_raise(ArgumentError) { Pathname.new("a\0") }
  273. end
  274. class AnotherStringLike # :nodoc:
  275. def initialize(s) @s = s end
  276. def to_str() @s end
  277. def ==(other) @s == other end
  278. end
  279. def test_equality
  280. obj = Pathname.new("a")
  281. str = "a"
  282. sym = :a
  283. ano = AnotherStringLike.new("a")
  284. assert_equal(false, obj == str)
  285. assert_equal(false, str == obj)
  286. assert_equal(false, obj == ano)
  287. assert_equal(false, ano == obj)
  288. assert_equal(false, obj == sym)
  289. assert_equal(false, sym == obj)
  290. obj2 = Pathname.new("a")
  291. assert_equal(true, obj == obj2)
  292. assert_equal(true, obj === obj2)
  293. assert_equal(true, obj.eql?(obj2))
  294. end
  295. def test_hashkey
  296. h = {}
  297. h[Pathname.new("a")] = 1
  298. h[Pathname.new("a")] = 2
  299. assert_equal(1, h.size)
  300. end
  301. def assert_pathname_cmp(e, s1, s2)
  302. p1 = Pathname.new(s1)
  303. p2 = Pathname.new(s2)
  304. r = p1 <=> p2
  305. assert(e == r,
  306. "#{p1.inspect} <=> #{p2.inspect}: <#{e}> expected but was <#{r}>")
  307. end
  308. def test_comparison
  309. assert_pathname_cmp( 0, "a", "a")
  310. assert_pathname_cmp( 1, "b", "a")
  311. assert_pathname_cmp(-1, "a", "b")
  312. ss = %w(
  313. a
  314. a/
  315. a/b
  316. a.
  317. a0
  318. )
  319. s1 = ss.shift
  320. ss.each {|s2|
  321. assert_pathname_cmp(-1, s1, s2)
  322. s1 = s2
  323. }
  324. end
  325. def test_comparison_string
  326. assert_equal(nil, Pathname.new("a") <=> "a")
  327. assert_equal(nil, "a" <=> Pathname.new("a"))
  328. end
  329. def pathsub(path, pat, repl) Pathname.new(path).sub(pat, repl).to_s end
  330. defassert(:pathsub, "a.o", "a.c", /\.c\z/, ".o")
  331. def test_sub_matchdata
  332. result = Pathname("abc.gif").sub(/\..*/) {
  333. assert_not_nil($~)
  334. assert_equal(".gif", $~[0])
  335. ".png"
  336. }
  337. assert_equal("abc.png", result.to_s)
  338. end
  339. def root?(path)
  340. Pathname.new(path).root?
  341. end
  342. defassert(:root?, true, "/")
  343. defassert(:root?, true, "//")
  344. defassert(:root?, true, "///")
  345. defassert(:root?, false, "")
  346. defassert(:root?, false, "a")
  347. def test_destructive_update
  348. path = Pathname.new("a")
  349. path.to_s.replace "b"
  350. assert_equal(Pathname.new("a"), path)
  351. end
  352. def test_null_character
  353. assert_raise(ArgumentError) { Pathname.new("\0") }
  354. end
  355. def test_taint
  356. obj = Pathname.new("a"); assert_same(obj, obj.taint)
  357. obj = Pathname.new("a"); assert_same(obj, obj.untaint)
  358. assert_equal(false, Pathname.new("a" ) .tainted?)
  359. assert_equal(false, Pathname.new("a" ) .to_s.tainted?)
  360. assert_equal(true, Pathname.new("a" ).taint .tainted?)
  361. assert_equal(true, Pathname.new("a" ).taint.to_s.tainted?)
  362. assert_equal(true, Pathname.new("a".taint) .tainted?)
  363. assert_equal(true, Pathname.new("a".taint) .to_s.tainted?)
  364. assert_equal(true, Pathname.new("a".taint).taint .tainted?)
  365. assert_equal(true, Pathname.new("a".taint).taint.to_s.tainted?)
  366. str = "a"
  367. path = Pathname.new(str)
  368. str.taint
  369. assert_equal(false, path .tainted?)
  370. assert_equal(false, path.to_s.tainted?)
  371. end
  372. def test_untaint
  373. obj = Pathname.new("a"); assert_same(obj, obj.untaint)
  374. assert_equal(false, Pathname.new("a").taint.untaint .tainted?)
  375. assert_equal(false, Pathname.new("a").taint.untaint.to_s.tainted?)
  376. str = "a".taint
  377. path = Pathname.new(str)
  378. str.untaint
  379. assert_equal(true, path .tainted?)
  380. assert_equal(true, path.to_s.tainted?)
  381. end
  382. def test_freeze
  383. obj = Pathname.new("a"); assert_same(obj, obj.freeze)
  384. assert_equal(false, Pathname.new("a" ) .frozen?)
  385. assert_equal(false, Pathname.new("a".freeze) .frozen?)
  386. assert_equal(true, Pathname.new("a" ).freeze .frozen?)
  387. assert_equal(true, Pathname.new("a".freeze).freeze .frozen?)
  388. assert_equal(false, Pathname.new("a" ) .to_s.frozen?)
  389. assert_equal(false, Pathname.new("a".freeze) .to_s.frozen?)
  390. assert_equal(false, Pathname.new("a" ).freeze.to_s.frozen?)
  391. assert_equal(false, Pathname.new("a".freeze).freeze.to_s.frozen?)
  392. end
  393. def test_to_s
  394. str = "a"
  395. obj = Pathname.new(str)
  396. assert_equal(str, obj.to_s)
  397. assert_not_same(str, obj.to_s)
  398. assert_not_same(obj.to_s, obj.to_s)
  399. end
  400. def test_kernel_open
  401. count = 0
  402. result = Kernel.open(Pathname.new(__FILE__)) {|f|
  403. assert(File.identical?(__FILE__, f))
  404. count += 1
  405. 2
  406. }
  407. assert_equal(1, count)
  408. assert_equal(2, result)
  409. end
  410. def test_each_filename
  411. result = []
  412. Pathname.new("/usr/bin/ruby").each_filename {|f| result << f }
  413. assert_equal(%w[usr bin ruby], result)
  414. end
  415. def test_kernel_pathname
  416. assert_equal(Pathname.new("a"), Pathname("a"))
  417. end
  418. end