-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathconstructor-command_spec.rb
More file actions
228 lines (204 loc) · 6.69 KB
/
constructor-command_spec.rb
File metadata and controls
228 lines (204 loc) · 6.69 KB
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# encoding: UTF-8
require 'spec_helper'
require 'pp'
# ======[ :Constructor {{{1
# Tests with parameters are done in *-class_spec.rb tests
# Test expanding with <Plug>MuT_ckword don't seem to work correctly
# TODO: C++11
RSpec.describe ":Constructor command", :cpp, :ctr_cmd do
let (:filename) { "test.cpp" }
# ====[ Executed once before all test {{{2
before :all do
if !defined? vim.runtime
vim.define_singleton_method(:runtime) do |path|
self.command("runtime #{path}")
end
end
vim.runtime('spec/support/input-mock.vim')
expect(vim.command('verbose function lh#ui#input')).to match(/input-mock.vim/)
vim.set('report=9999')
expect(vim.echo('lh#mut#dirs#get_templates_for("cpp/value-class")')).to match(/value-class.template/)
expect(vim.echo('lh#style#clear()')).to eq '0'
vim.command('UseStyle breakbeforebraces=stroustrup -ft=c')
vim.command('UseStyle spacesbeforeparens=control-statements -ft=c')
vim.command('UseStyle empty_braces=empty -ft=c')
end
# ====[ Always executed before each test {{{2
before :each do
vim.command('filetype plugin on')
vim.command("file #{filename}")
vim.set('ft=cpp')
vim.set('expandtab')
vim.set('sw=4')
vim.command('silent! unlet g:cpp_explicit_default')
vim.command('silent! unlet g:cpp_std_flavour')
vim.command('silent! unlet g:mocked_input')
vim.command('silent! unlet g:mocked_confirm')
vim.command('silent! unlet g:cpp_use_copy_and_swap')
clear_buffer
set_buffer_contents <<-EOF
class Foo {
public:
private:
std::string m_bar;
int * m_foo;
};
EOF
vim.write()
vim.feedkeys('a\<esc>') # pause
# expect(system("ctags --c++-kinds=+p --fields=+imaS --extras=+q --language-force=C++ -f tags #{filename}")).to be true
# system('less tags')
vim.command("let b:tags_dirname = expand('%:p:h')")
vim.command("let &l:tags.=','.b:tags_dirname.'/tags'")
# system('echo "'+vim.echo('lh#dev#class#attributes("Foo")')+'"')
assert_buffer_contents <<-EOF
class Foo {
public:
private:
std::string m_bar;
int * m_foo;
};
EOF
expect(vim.echo('line("$")')).to eq '7'
expect(vim.echo('setpos(".", [1,3,1,0])')).to eq '0'
expect(vim.echo('line(".")')).to eq '3'
end
# ====[ default constructor {{{2
context "when expanding default-constructor", :default_ctr do
it "has a pointer attribute" do # {{{3
# TODO: In C++11, no need for m_bar() if there is a default
# initialisation at class scope
# expect(vim.echo('lh#dev#class#attributes("Foo")')).to eq('m_bar')
# expect(vim.echo('lh#cpp#constructors#debug("s:Attributes(\"Foo\")")')).to eq('m_bar')
# vim.command('Constructor default')
vim.echo('lh#cpp#constructors#Main("default")')
# expect(vim.echo('g:step."--".string(g:implproto)')).to eq('42')
# expect(vim.echo('g:step')).to eq('42')
vim.feedkeys('a\<esc>') # pause
assert_buffer_contents <<-EOF
class Foo {
public:
/**
* Default constructor.
* «@throw »
*/
Foo();
private:
std::string m_bar;
int * m_foo;
};
Foo::Foo()
: m_bar()
, m_foo()
{}
EOF
end
end # }}}3
# ====[ copy-constructor {{{2
context "when expanding copy-constructor", :copy_ctr do
it "has a pointer attribute" do # {{{3
# vim.command('Constructor copy')
vim.echo('lh#cpp#constructors#Main("copy")')
vim.feedkeys('a\<esc>') # pause
assert_buffer_contents <<-EOF
class Foo {
public:
/**
* Copy constructor.
* @param[in] rhs source data to be copied.
* «@throw »
*/
Foo(Foo const& rhs);
private:
std::string m_bar;
int * m_foo;
};
Foo::Foo(Foo const& rhs)
: m_bar(rhs.m_bar)
, m_foo(«duplicate(rhs.m_foo)»)
{}
EOF
end
end # }}}3
# ====[ assignment-operator {{{2
context "when expanding assignment-operator", :assign_copy do
it "has a pointer attribute" do # {{{3
vim.command('let g:mocked_confirm = 0')
# expect(vim.echo('lh#dev#class#attributes("Foo")')).to eq('m_bar')
# expect(vim.echo('lh#cpp#constructors#debug("s:Attributes(\"Foo\")")')).to eq('m_bar')
vim.echo('lh#cpp#constructors#Main("assign")')
# expect(vim.echo('lh#cpp#constructors#Main("assign")')).to eq '0'
# vim.command('Constructor assign')
# expect(vim.echo('string(g:implproto)')).to eq('42')
# expect(vim.echo('g:step')).to eq('42')
vim.feedkeys('a\<esc>') # pause
assert_buffer_contents <<-EOF
class Foo {
public:
/**
* Assignment operator.
* @param[in] rhs source data to be copied.
* «@throw »
*/
Foo& operator=(Foo const& rhs);
private:
std::string m_bar;
int * m_foo;
};
Foo& Foo::operator=(Foo const& rhs)
{
m_bar = rhs.m_bar;
m_foo = «duplicate(rhs.m_foo)»;
}
EOF
end
end # }}}3
# ====[ copy'n'swap {{{2
context "when expanding copy-and-swap", :copy_n_swap do
it "has a pointer attribute" do # {{{3
vim.command('let g:mocked_confirm = 1')
# vim.command('Constructor assign')
vim.echo('lh#cpp#constructors#Main("assign")')
vim.feedkeys('a\<esc>') # pause
assert_buffer_contents <<-EOF
class Foo {
public:
/**
* Assignment operator.
* @param[in] rhs source data to be copied.
* «@throw »
*
* @note based on copy-and-swap idiom, with copy-elision exploited
* @note exception-safe
*/
Foo& operator=(Foo rhs)
{
this->swap(rhs);
return *this;
}
/**
* Swap operation.
* @param[in,out] other data with which content is swapped
* @throw None
*/
void swap(Foo & other) throw();
private:
std::string m_bar;
int * m_foo;
};
void Foo::swap(Foo & other) throw()
{
using std::swap;
swap(m_bar, other.m_bar);
swap(m_foo, other.m_foo);
}
EOF
end
end # }}}3
# ====[ init constructor {{{2
# No test for init-constructor as it requires a user-interaction and
# vimrunner+vim client-server architecture doesn't work very-well together
# }}}2
end
# }}}1
# vim:set sw=2:fdm=marker: