virtfs 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +8 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +154 -0
  8. data/Rakefile +5 -0
  9. data/lib/virtfs-nativefs-thick.rb +1 -0
  10. data/lib/virtfs-nativefs-thin.rb +1 -0
  11. data/lib/virtfs.rb +38 -0
  12. data/lib/virtfs/activation.rb +97 -0
  13. data/lib/virtfs/block_io.rb +140 -0
  14. data/lib/virtfs/byte_range.rb +71 -0
  15. data/lib/virtfs/context.rb +300 -0
  16. data/lib/virtfs/context_manager.rb +175 -0
  17. data/lib/virtfs/context_switch_class_methods.rb +96 -0
  18. data/lib/virtfs/delegate_module.rb +40 -0
  19. data/lib/virtfs/dir_instance_delegate.rb +3 -0
  20. data/lib/virtfs/exception.rb +13 -0
  21. data/lib/virtfs/file_instance_delegate.rb +3 -0
  22. data/lib/virtfs/file_modes_and_options.rb +293 -0
  23. data/lib/virtfs/find_class_methods.rb +106 -0
  24. data/lib/virtfs/io_buffer.rb +133 -0
  25. data/lib/virtfs/io_instance_delegate.rb +3 -0
  26. data/lib/virtfs/kernel.rb +146 -0
  27. data/lib/virtfs/nativefs/thick.rb +30 -0
  28. data/lib/virtfs/nativefs/thick/dir_class_methods.rb +38 -0
  29. data/lib/virtfs/nativefs/thick/file_class_methods.rb +178 -0
  30. data/lib/virtfs/nativefs/thin.rb +32 -0
  31. data/lib/virtfs/nativefs/thin/dir.rb +30 -0
  32. data/lib/virtfs/nativefs/thin/dir_class_methods.rb +41 -0
  33. data/lib/virtfs/nativefs/thin/file.rb +112 -0
  34. data/lib/virtfs/nativefs/thin/file_class_methods.rb +181 -0
  35. data/lib/virtfs/protofs/protofs.rb +7 -0
  36. data/lib/virtfs/protofs/protofs_base.rb +12 -0
  37. data/lib/virtfs/protofs/protofs_dir.rb +13 -0
  38. data/lib/virtfs/protofs/protofs_dir_class.rb +31 -0
  39. data/lib/virtfs/protofs/protofs_file.rb +27 -0
  40. data/lib/virtfs/protofs/protofs_file_class.rb +136 -0
  41. data/lib/virtfs/stat.rb +100 -0
  42. data/lib/virtfs/thin_dir_delegator.rb +79 -0
  43. data/lib/virtfs/thin_file_delegator.rb +77 -0
  44. data/lib/virtfs/thin_io_delegator_methods.rb +301 -0
  45. data/lib/virtfs/thin_io_delegator_methods_bufferio.rb +337 -0
  46. data/lib/virtfs/v_dir.rb +238 -0
  47. data/lib/virtfs/v_file.rb +480 -0
  48. data/lib/virtfs/v_io.rb +243 -0
  49. data/lib/virtfs/v_pathname.rb +128 -0
  50. data/lib/virtfs/version.rb +3 -0
  51. data/spec/activate_spec.rb +202 -0
  52. data/spec/chroot_spec.rb +120 -0
  53. data/spec/context_manager_class_spec.rb +246 -0
  54. data/spec/context_manager_instance_spec.rb +255 -0
  55. data/spec/context_spec.rb +335 -0
  56. data/spec/data/UTF-16LE-data.txt +0 -0
  57. data/spec/data/UTF-8-data.txt +212 -0
  58. data/spec/dir_class_spec.rb +506 -0
  59. data/spec/dir_instance_spec.rb +208 -0
  60. data/spec/file_class_spec.rb +2106 -0
  61. data/spec/file_instance_spec.rb +154 -0
  62. data/spec/file_modes_and_options_spec.rb +1556 -0
  63. data/spec/find_spec.rb +142 -0
  64. data/spec/io_bufferio_size_shared_examples.rb +371 -0
  65. data/spec/io_bufferio_size_spec.rb +861 -0
  66. data/spec/io_bufferio_spec.rb +801 -0
  67. data/spec/io_class_spec.rb +145 -0
  68. data/spec/io_instance_spec.rb +516 -0
  69. data/spec/kernel_spec.rb +285 -0
  70. data/spec/mount_spec.rb +186 -0
  71. data/spec/nativefs_local_root_spec.rb +132 -0
  72. data/spec/path_spec.rb +39 -0
  73. data/spec/spec_helper.rb +126 -0
  74. data/tasks/rspec.rake +3 -0
  75. data/tasks/yard.rake +7 -0
  76. data/test/UTF-8-demo.txt +212 -0
  77. data/test/bench.rb +18 -0
  78. data/test/bio_internal_test.rb +45 -0
  79. data/test/delegate_io.rb +31 -0
  80. data/test/delegate_module.rb +62 -0
  81. data/test/encode_test.rb +42 -0
  82. data/test/enoent_test.rb +30 -0
  83. data/test/namespace_test.rb +42 -0
  84. data/test/read_block_valid_encoding.rb +44 -0
  85. data/test/read_test.rb +78 -0
  86. data/test/stream_readers.rb +46 -0
  87. data/test/utf-16-demo.txt +0 -0
  88. data/test/utf8_to_utf16.rb +77 -0
  89. data/test/wrapper_test.rb +34 -0
  90. data/virtfs.gemspec +29 -0
  91. metadata +230 -0
@@ -0,0 +1,132 @@
1
+ require 'spec_helper'
2
+
3
+ describe "NativeFS local root (mount subdurectory)" do
4
+ before(:all) do
5
+ @root = VfsRealFile::SEPARATOR
6
+ @mnt = VfsRealDir.mktmpdir
7
+ @top_dir = "Dir1"
8
+
9
+ @rb_file = "hello_world.rb"
10
+ @lib_name = "hello_world"
11
+ @module_name = 'HelloWorld'
12
+
13
+ @rb_code = <<-END_OF_CODE
14
+ module #{@module_name}
15
+ def self.hello
16
+ "Hello World!"
17
+ end
18
+ end
19
+ END_OF_CODE
20
+
21
+ reset_context
22
+
23
+ @native_fs1 = nativefs_class.new
24
+ VirtFS.mount(@native_fs1, @root) # mount / on /
25
+ end
26
+
27
+ after(:all) do
28
+ VirtFS.umount(@root) if VirtFS.mounted?(@root)
29
+ VfsRealDir.rmdir(@mnt)
30
+ end
31
+
32
+ before(:each) do
33
+ @tmp_dir = VfsRealDir.mktmpdir # The subdirectory to mount
34
+
35
+ @native_fs2 = nativefs_class.new(@tmp_dir)
36
+ VirtFS.mount(@native_fs2, @mnt) # mount @tmp_dir on @mnt
37
+ end
38
+
39
+ after(:each) do
40
+ VirtFS.umount(@mnt) if VirtFS.mounted?(@mnt)
41
+ FileUtils.remove_dir(@tmp_dir)
42
+ end
43
+
44
+ context "Directory access -" do
45
+ it "Directories created through the subdir should be visible through the mount point" do
46
+ VirtFS::VDir.chdir(@tmp_dir) do
47
+ mk_dir_tree(VirtFS::VDir, "Dir1", 4, 3)
48
+ expect(check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)).to be_nil
49
+ end
50
+ VirtFS::VDir.chdir(@mnt) do
51
+ expect(check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)).to be_nil
52
+ end
53
+ end
54
+
55
+ it "Directories created through the mount point should be visible through the subdir" do
56
+ VirtFS::VDir.chdir(@mnt) do
57
+ mk_dir_tree(VirtFS::VDir, "Dir1", 4, 3)
58
+ expect(check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)).to be_nil
59
+ end
60
+ VirtFS::VDir.chdir(@tmp_dir) do
61
+ expect(check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)).to be_nil
62
+ end
63
+ end
64
+
65
+ it "After unmount, directories should no longer be visible under mount point" do
66
+ VirtFS::VDir.chdir(@mnt) do
67
+ mk_dir_tree(VirtFS::VDir, "Dir1", 4, 3)
68
+ expect(check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)).to be_nil
69
+ end
70
+
71
+ VirtFS.umount(@mnt)
72
+
73
+ VirtFS::VDir.chdir(@mnt) do
74
+ expect do
75
+ check_dir_tree(VirtFS::VDir, "Dir1", 4, 3)
76
+ end.to raise_error(
77
+ RuntimeError, "Expected directory Dir1 does not exist"
78
+ )
79
+ end
80
+ end
81
+ end
82
+
83
+ context "File access -" do
84
+ it "Files created through the subdir should be visible through the mount point" do
85
+ VirtFS::VDir.chdir(@tmp_dir) do
86
+ VirtFS::VFile.open(@rb_file, "w") do |f|
87
+ f.write(@rb_code)
88
+ end
89
+ expect(VirtFS::VFile.exist?(@rb_file)).to be true
90
+ end
91
+ VirtFS::VDir.chdir(@mnt) do
92
+ expect(VirtFS::VFile.exist?(@rb_file)).to be true
93
+ end
94
+ end
95
+
96
+ it "Directories created through the mount point should be visible through the subdir" do
97
+ VirtFS::VDir.chdir(@mnt) do
98
+ VirtFS::VFile.open(@rb_file, "w") do |f|
99
+ f.write(@rb_code)
100
+ end
101
+ expect(VirtFS::VFile.exist?(@rb_file)).to be true
102
+ end
103
+ VirtFS::VDir.chdir(@tmp_dir) do
104
+ expect(VirtFS::VFile.exist?(@rb_file)).to be true
105
+ end
106
+ end
107
+
108
+ it "After unmount, directories should no longer be visible under mount point" do
109
+ VirtFS::VDir.chdir(@mnt) do
110
+ VirtFS::VFile.open(@rb_file, "w") do |f|
111
+ f.write(@rb_code)
112
+ end
113
+ expect(VirtFS::VFile.exist?(@rb_file)).to be true
114
+ end
115
+
116
+ VirtFS.umount(@mnt)
117
+
118
+ VirtFS::VDir.chdir(@mnt) do
119
+ expect(VirtFS::VFile.exist?(@rb_file)).to be false
120
+ end
121
+ end
122
+
123
+ it "Reading file should return the expected data" do
124
+ VirtFS::VDir.chdir(@mnt) do
125
+ VirtFS::VFile.open(@rb_file, "w") do |f|
126
+ f.write(@rb_code)
127
+ end
128
+ expect(VirtFS::VFile.read(@rb_file)).to eq(@rb_code)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe VirtFS, "path support methods (#{$fs_interface} interface)" do
4
+ before(:all) do
5
+ @full_path = File.expand_path(__FILE__)
6
+ @rel_path = File.basename(@full_path)
7
+ @this_dir = File.dirname(@full_path)
8
+ end
9
+
10
+ before(:each) do
11
+ reset_context
12
+ end
13
+
14
+ describe ".dir_getwd" do
15
+ it "should default to '/'" do
16
+ expect(VirtFS.dir_getwd).to eq('/')
17
+ end
18
+
19
+ it "return the value set by .dir_chdir" do
20
+ VirtFS.cwd = @this_dir
21
+ expect(VirtFS.dir_getwd).to eq(@this_dir)
22
+ end
23
+ end
24
+
25
+ describe ".normalize_path" do
26
+ it "should return full path, given full path" do
27
+ expect(VirtFS.normalize_path(@full_path)).to eq(@full_path)
28
+ end
29
+
30
+ it "should return full path, given relative path" do
31
+ expect(VirtFS.normalize_path(@rel_path, @this_dir)).to eq(@full_path)
32
+ end
33
+
34
+ it "should return full path, given relative path (based on cwd)" do
35
+ VirtFS.cwd = @this_dir
36
+ expect(VirtFS.normalize_path(@rel_path)).to eq(@full_path)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,126 @@
1
+ require "tmpdir"
2
+ require "tempfile"
3
+ require "find"
4
+ require "virtfs"
5
+
6
+ if ENV['FS_INTERFACE'] && ENV['FS_INTERFACE'].downcase == "thick"
7
+ $fs_interface = "Thick" # rubocop:disable Style/GlobalVars
8
+ require "virtfs-nativefs-thick"
9
+ else
10
+ $fs_interface = "Thin" # rubocop:disable Style/GlobalVars
11
+ require "virtfs-nativefs-thin"
12
+ end
13
+
14
+ def nativefs_class
15
+ if $fs_interface == "Thin" # rubocop:disable Style/GlobalVars
16
+ VirtFS::NativeFS::Thin
17
+ else
18
+ VirtFS::NativeFS::Thick
19
+ end
20
+ end
21
+
22
+ def reset_context
23
+ VirtFS.deactivate! if VirtFS.activated?
24
+ VirtFS.context_manager.reset_all
25
+ end
26
+
27
+ def buffer_test_sizes
28
+ [1024 * 32, 1]
29
+ end
30
+
31
+ def temp_name(pfx = "", sfx = "")
32
+ VfsRealDir::Tmpname.create([pfx, sfx]) {}
33
+ end
34
+
35
+ def block_dev_file
36
+ dev_dir = "/dev"
37
+ return nil unless VfsRealDir.exist?(dev_dir)
38
+ Find.find(dev_dir) do |f|
39
+ next unless VfsRealFile.blockdev?(f)
40
+ return f
41
+ end
42
+ nil
43
+ end
44
+
45
+ def char_dev_file
46
+ dev_dir = "/dev"
47
+ return nil unless VfsRealDir.exist?(dev_dir)
48
+ Find.find(dev_dir) do |f|
49
+ next unless VfsRealFile.chardev?(f)
50
+ return f
51
+ end
52
+ nil
53
+ end
54
+
55
+ def mk_dir_tree(dir_class, prefix, breadth, depth, lvl = 0)
56
+ return if lvl >= depth
57
+ dir_class.mkdir(prefix)
58
+ dir_class.chdir(prefix) do
59
+ (1..breadth).each do |idx|
60
+ mk_dir_tree(dir_class, "#{prefix}.#{idx}", breadth, depth, lvl + 1)
61
+ end
62
+ end
63
+ nil
64
+ end
65
+
66
+ def check_dir_tree(dir_class, prefix, breadth, depth, lvl = 0)
67
+ return if lvl >= depth
68
+ raise "Expected directory #{prefix} does not exist" unless dir_class.exist?(prefix)
69
+ dir_class.chdir(prefix) do
70
+ (1..breadth).each do |idx|
71
+ check_dir_tree(dir_class, "#{prefix}.#{idx}", breadth, depth, lvl + 1)
72
+ end
73
+ end
74
+ nil
75
+ end
76
+
77
+ def rm_dir_tree(dir_class, prefix, breadth, depth, lvl = 0)
78
+ return if lvl >= depth
79
+ raise "Expected directory #{prefix} does not exist" unless dir_class.exist?(prefix)
80
+ dir_class.chdir(prefix) do
81
+ (1..breadth).each do |idx|
82
+ rm_dir_tree(dir_class, "#{prefix}.#{idx}", breadth, depth, lvl + 1)
83
+ end
84
+ end
85
+ dir_class.delete(prefix)
86
+ nil
87
+ end
88
+
89
+ def write_test_file(file_class, path, start_marker:, end_marker:, data1:, data2:) # rubocop:disable ParameterLists
90
+ size = start_marker.bytesize + end_marker.bytesize
91
+ file_class.open(path, "w") do |file|
92
+ file.write(start_marker)
93
+ (0..9).each do
94
+ file.write(data1)
95
+ size += data1.bytesize
96
+ file.write(data2)
97
+ size += data2.bytesize
98
+ end
99
+ file.write(end_marker)
100
+ end
101
+ size
102
+ end
103
+
104
+ def check_test_file(file_class, path, start_marker:, end_marker:, data1:, data2:) # rubocop:disable ParameterLists
105
+ file_class.open(path, "r") do |file|
106
+ check_str(file.read(start_marker.bytesize), start_marker)
107
+ (0..9).each do
108
+ check_str(file.read(data1.bytesize), data1)
109
+ check_str(file.read(data2.bytesize), data2)
110
+ end
111
+ check_str(file.read(end_marker.bytesize), end_marker)
112
+ end
113
+ nil
114
+ end
115
+
116
+ def check_str(s1, s2)
117
+ raise "Unexpected file contents, expected: #{s1} got #{s2}" unless s1 == s2
118
+ end
119
+
120
+ def suppress_warnings
121
+ original_verbosity = $VERBOSE
122
+ $VERBOSE = nil
123
+ result = yield
124
+ $VERBOSE = original_verbosity
125
+ result
126
+ end
@@ -0,0 +1,3 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,7 @@
1
+ require 'yard'
2
+
3
+ YARD::Rake::YardocTask.new do |t|
4
+ t.files = ['lib/**/*.rb']
5
+ t.options = ['--any', '--extra', '--opts']
6
+ t.stats_options = ['--list-undoc']
7
+ end
@@ -0,0 +1,212 @@
1
+
2
+ UTF-8 encoded sample plain-text file
3
+ ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
4
+
5
+ Markus Kuhn [ˈmaʳkʊs kuːn] <http://www.cl.cam.ac.uk/~mgk25/> — 2002-07-25
6
+
7
+
8
+ The ASCII compatible UTF-8 encoding used in this plain-text file
9
+ is defined in Unicode, ISO 10646-1, and RFC 2279.
10
+
11
+
12
+ Using Unicode/UTF-8, you can write in emails and source code things such as
13
+
14
+ Mathematics and sciences:
15
+
16
+ ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫
17
+ ⎪⎢⎜│a²+b³ ⎟⎥⎪
18
+ ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪
19
+ ⎪⎢⎜⎷ c₈ ⎟⎥⎪
20
+ ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬
21
+ ⎪⎢⎜ ∞ ⎟⎥⎪
22
+ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪
23
+ ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪
24
+ 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭
25
+
26
+ Linguistics and dictionaries:
27
+
28
+ ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
29
+ Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
30
+
31
+ APL:
32
+
33
+ ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈
34
+
35
+ Nicer typography in plain text files:
36
+
37
+ ╔══════════════════════════════════════════╗
38
+ ║ ║
39
+ ║ • ‘single’ and “double” quotes ║
40
+ ║ ║
41
+ ║ • Curly apostrophes: “We’ve been here” ║
42
+ ║ ║
43
+ ║ • Latin-1 apostrophe and accents: '´` ║
44
+ ║ ║
45
+ ║ • ‚deutsche‘ „Anführungszeichen“ ║
46
+ ║ ║
47
+ ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║
48
+ ║ ║
49
+ ║ • ASCII safety test: 1lI|, 0OD, 8B ║
50
+ ║ ╭─────────╮ ║
51
+ ║ • the euro symbol: │ 14.95 € │ ║
52
+ ║ ╰─────────╯ ║
53
+ ╚══════════════════════════════════════════╝
54
+
55
+ Combining characters:
56
+
57
+ STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑
58
+
59
+ Greek (in Polytonic):
60
+
61
+ The Greek anthem:
62
+
63
+ Σὲ γνωρίζω ἀπὸ τὴν κόψη
64
+ τοῦ σπαθιοῦ τὴν τρομερή,
65
+ σὲ γνωρίζω ἀπὸ τὴν ὄψη
66
+ ποὺ μὲ βία μετράει τὴ γῆ.
67
+
68
+ ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
69
+ τῶν ῾Ελλήνων τὰ ἱερά
70
+ καὶ σὰν πρῶτα ἀνδρειωμένη
71
+ χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
72
+
73
+ From a speech of Demosthenes in the 4th century BC:
74
+
75
+ Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
76
+ ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
77
+ λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
78
+ τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
79
+ εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
80
+ πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
81
+ οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
82
+ οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
83
+ ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
84
+ τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
85
+ γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
86
+ προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
87
+ σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
88
+ τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
89
+ τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
90
+ τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
91
+
92
+ Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
93
+
94
+ Georgian:
95
+
96
+ From a Unicode conference invitation:
97
+
98
+ გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
99
+ კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
100
+ ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
101
+ ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
102
+ ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
103
+ ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
104
+ ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.
105
+
106
+ Russian:
107
+
108
+ From a Unicode conference invitation:
109
+
110
+ Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
111
+ Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
112
+ Конференция соберет широкий круг экспертов по вопросам глобального
113
+ Интернета и Unicode, локализации и интернационализации, воплощению и
114
+ применению Unicode в различных операционных системах и программных
115
+ приложениях, шрифтах, верстке и многоязычных компьютерных системах.
116
+
117
+ Thai (UCS Level 2):
118
+
119
+ Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
120
+ classic 'San Gua'):
121
+
122
+ [----------------------------|------------------------]
123
+ ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่
124
+ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา
125
+ ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา
126
+ โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ
127
+ เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ
128
+ ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
129
+ พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้
130
+ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ
131
+
132
+ (The above is a two-column text. If combining characters are handled
133
+ correctly, the lines of the second column should be aligned with the
134
+ | character above.)
135
+
136
+ Ethiopian:
137
+
138
+ Proverbs in the Amharic language:
139
+
140
+ ሰማይ አይታረስ ንጉሥ አይከሰስ።
141
+ ብላ ካለኝ እንደአባቴ በቆመጠኝ።
142
+ ጌጥ ያለቤቱ ቁምጥና ነው።
143
+ ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
144
+ የአፍ ወለምታ በቅቤ አይታሽም።
145
+ አይጥ በበላ ዳዋ ተመታ።
146
+ ሲተረጉሙ ይደረግሙ።
147
+ ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
148
+ ድር ቢያብር አንበሳ ያስር።
149
+ ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
150
+ እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
151
+ የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
152
+ ሥራ ከመፍታት ልጄን ላፋታት።
153
+ ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
154
+ የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
155
+ ተንጋሎ ቢተፉ ተመልሶ ባፉ።
156
+ ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
157
+ እግርህን በፍራሽህ ልክ ዘርጋ።
158
+
159
+ Runes:
160
+
161
+ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
162
+
163
+ (Old English, which transcribed into Latin reads 'He cwaeth that he
164
+ bude thaem lande northweardum with tha Westsae.' and means 'He said
165
+ that he lived in the northern land near the Western Sea.')
166
+
167
+ Braille:
168
+
169
+ ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌
170
+
171
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
172
+ ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
173
+ ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
174
+ ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
175
+ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
176
+ ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲
177
+
178
+ ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
179
+
180
+ ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
181
+ ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
182
+ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
183
+ ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹
184
+ ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎
185
+ ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
186
+ ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
187
+ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
188
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
189
+
190
+ (The first couple of paragraphs of "A Christmas Carol" by Dickens)
191
+
192
+ Compact font selection example text:
193
+
194
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
195
+ abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
196
+ –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
197
+ ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა
198
+
199
+ Greetings in various languages:
200
+
201
+ Hello world, Καλημέρα κόσμε, コンニチハ
202
+
203
+ Box drawing alignment tests: █
204
+
205
+ ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
206
+ ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
207
+ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
208
+ ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
209
+ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
210
+ ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
211
+ ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
212
+ ▝▀▘▙▄▟