v
Зеркало из https://github.com/vlang/v
1import os
2import encoding.txtar
3
4// txtar implements a trivial text-based file archive format,
5// Ported from https://cs.opensource.google/go/x/tools/+/master:txtar/archive.go
6// It has some convenience additions (the txtar.pack/1 and txtar.unpack/1 functions).
7// See also the README.md file in this folder.
8
9fn test_parse_nothing() {
10dump(@LOCATION)
11content := ''
12a := txtar.parse(content)
13assert a.str() == content
14assert a.comment == ''
15assert a.files.len == 0
16}
17
18fn test_parse_no_files() {
19dump(@LOCATION)
20content := 'some
21comments
22'
23a := txtar.parse(content)
24assert a.str() == content
25assert a.comment != ''
26assert a.files.len == 0
27}
28
29fn test_parse_no_comments() {
30dump(@LOCATION)
31content := '-- abc.xyz --
32line1
33-- another.txt --
34z line1
35'
36a := txtar.parse(content)
37assert a.str() == content
38assert a.comment == ''
39assert a.files.len == 2
40assert a.files[0].path == 'abc.xyz'
41assert a.files[0].content.split_into_lines() == ['line1']
42assert a.files[1].path == 'another.txt'
43assert a.files[1].content.split_into_lines() == ['z line1']
44}
45
46const simple_archive_content = 'some
47
48comments on
49several lines
50-- abc.xyz --
51line1
52line2
53-- empty --
54-- folder2/another.txt --
55z line1
56z line2
57z line3
58-- folder3/final.txt --
59'
60
61fn test_parse() {
62dump(@LOCATION)
63a := txtar.parse(simple_archive_content)
64assert a.str() == simple_archive_content
65assert a.comment != ''
66assert a.comment.split_into_lines().len == 4
67assert a.comment.contains('\n\n')
68assert a.files.len == 4
69assert a.files[0].path == 'abc.xyz'
70assert a.files[0].content.split_into_lines() == ['line1', 'line2']
71assert a.files[1].path == 'empty'
72assert a.files[1].content == ''
73assert a.files[2].path == 'folder2/another.txt'
74assert a.files[2].content.split_into_lines() == ['z line1', 'z line2', 'z line3']
75assert a.files[3].path == 'folder3/final.txt'
76assert a.files[3].content == ''
77}
78
79fn test_parse_file() {
80dump(@LOCATION)
81fpath := os.join_path(os.vtmp_dir(), 'txtar.txt')
82defer {
83os.rm(fpath) or {}
84}
85os.write_file(fpath, simple_archive_content)!
86a := txtar.parse_file(fpath)!
87assert a.comment != ''
88assert a.files.len == 4
89assert a.str() == simple_archive_content
90}
91
92fn test_unpack_to_folder_then_pack_same_folder() {
93dump(@LOCATION)
94folder := os.join_path(os.vtmp_dir(), 'txtar_folder')
95a := txtar.parse(simple_archive_content)
96
97txtar.unpack(a, folder)!
98check_folder(folder)
99os.rmdir_all(folder) or {}
100
101a.unpack_to(folder)!
102check_folder(folder)
103
104b := txtar.pack(folder, 'abc')!
105os.rmdir_all(folder) or {}
106
107assert a.comment != b.comment
108assert b.comment == 'abc'
109assert b.files.len == a.files.len
110ofiles := a.files.sorted(|x, y| x.path < y.path)
111pfiles := b.files.sorted(|x, y| x.path < y.path)
112assert ofiles == pfiles
113}
114
115fn check_folder(folder string) {
116assert os.is_file(os.join_path(folder, 'empty'))
117assert os.is_file(os.join_path(folder, 'folder2/another.txt'))
118assert os.is_file(os.join_path(folder, 'folder3/final.txt'))
119}
120