virtfs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ ▝▀▘▙▄▟