Skip to content

Commit 90442f1

Browse files
authored
Merge pull request #285 from windingtree/increase-coverage-crowdsale
Add tests and increase coverage in LifCrowdsale.sol
2 parents 3dba3e9 + 59e77ef commit 90442f1

File tree

1 file changed

+139
-16
lines changed

1 file changed

+139
-16
lines changed

test/Crowdsale.js

Lines changed: 139 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
var LifCrowdsale = artifacts.require('./LifCrowdsale.sol');
1+
var LifCrowdsale = artifacts.require('./LifCrowdsale.sol'),
2+
LifToken = artifacts.require('./LifToken.sol');
23

34
let help = require('./helpers');
45

56
var latestTime = require('./helpers/latestTime');
6-
var {duration} = require('./helpers/increaseTime');
7+
var {duration,increaseTimeTestRPCTo} = require('./helpers/increaseTime');
8+
9+
const defaultTimeDelta = duration.days(1); // time delta used in time calculations (for start, end1 & end2)
710

8-
const defaultStart = latestTime() + duration.days(1);
911
const defaults = {
10-
start: defaultStart,
11-
end1: defaultStart + duration.days(1),
12-
end2: defaultStart + duration.days(2),
1312
rate1: 100,
1413
rate2: 110,
1514
setWeiLockSeconds: duration.minutes(30),
@@ -20,9 +19,9 @@ const defaults = {
2019
contract('LifToken Crowdsale', function(accounts) {
2120

2221
async function createCrowdsale(params) {
23-
const startTimestamp = params.start === undefined ? defaults.start : params.start,
24-
end1Timestamp = params.end1 === undefined ? defaults.end1 : params.end1,
25-
end2Timestamp = params.end2 === undefined ? defaults.end2 : params.end2,
22+
const startTimestamp = params.start === undefined ? (latestTime() + defaultTimeDelta) : params.start,
23+
end1Timestamp = params.end1 === undefined ? (startTimestamp + defaultTimeDelta) : params.end1,
24+
end2Timestamp = params.end2 === undefined ? (end1Timestamp + defaultTimeDelta) : params.end2,
2625
rate1 = params.rate1 === undefined ? defaults.rate1 : params.rate1,
2726
rate2 = params.rate2 === undefined ? defaults.rate2 : params.rate2,
2827
setWeiLockSeconds = params.setWeiLockSeconds === undefined ? defaults.setWeiLockSeconds : params.setWeiLockSeconds,
@@ -39,11 +38,19 @@ contract('LifToken Crowdsale', function(accounts) {
3938
}
4039

4140
it('can create a Crowdsale', async function() {
42-
const crowdsale = await createCrowdsale({});
43-
44-
assert.equal(defaults.start, parseInt(await crowdsale.startTimestamp.call()));
45-
assert.equal(defaults.end1, parseInt(await crowdsale.end1Timestamp.call()));
46-
assert.equal(defaults.end2, parseInt(await crowdsale.end2Timestamp.call()));
41+
const start = latestTime() + defaultTimeDelta,
42+
end1 = start + defaultTimeDelta,
43+
end2 = end1 + defaultTimeDelta;
44+
45+
const crowdsale = await createCrowdsale({
46+
start: start,
47+
end1: end1,
48+
end2: end2
49+
});
50+
51+
assert.equal(start, parseInt(await crowdsale.startTimestamp.call()));
52+
assert.equal(end1, parseInt(await crowdsale.end1Timestamp.call()));
53+
assert.equal(end2, parseInt(await crowdsale.end2Timestamp.call()));
4754
assert.equal(defaults.rate1, parseInt(await crowdsale.rate1.call()));
4855
assert.equal(defaults.rate2, parseInt(await crowdsale.rate2.call()));
4956
assert.equal(accounts[defaults.foundationWalletIndex], parseInt(await crowdsale.foundationWallet.call()));
@@ -79,16 +86,20 @@ contract('LifToken Crowdsale', function(accounts) {
7986

8087
it('fails to create a Crowdsale with end timestamp not after start timestamp', async function() {
8188
try {
82-
await createCrowdsale({end1: defaults.start});
89+
const start = latestTime() + defaultTimeDelta;
90+
await createCrowdsale({start: start, end1: start});
8391
assert(false, 'create crowdsale should have thrown');
8492
} catch(e) {
8593
if (!help.isInvalidOpcodeEx(e)) throw e;
8694
}
8795
});
8896

8997
it('fails to create a Crowdsale with end2 timestamp not after end1 timestamp', async function() {
98+
const start = latestTime() + defaultTimeDelta,
99+
end1 = start + defaultTimeDelta;
100+
90101
try {
91-
await createCrowdsale({end2: defaults.end1});
102+
await createCrowdsale({start: start, end1: end1, end2: end1});
92103
assert(false, 'create crowdsale should have thrown');
93104
} catch(e) {
94105
if (!help.isInvalidOpcodeEx(e)) throw e;
@@ -121,4 +132,116 @@ contract('LifToken Crowdsale', function(accounts) {
121132
if (!help.isInvalidOpcodeEx(e)) throw e;
122133
}
123134
});
135+
136+
it('returns the current rate at different points in time', async function() {
137+
const start = latestTime() + defaultTimeDelta,
138+
end1 = start + defaultTimeDelta,
139+
end2 = end1 + defaultTimeDelta,
140+
crowdsale = await createCrowdsale({
141+
start: start,
142+
end1: end1,
143+
end2: end2
144+
});
145+
146+
assert.equal(0, parseInt(await crowdsale.getRate()));
147+
148+
await increaseTimeTestRPCTo(start);
149+
150+
assert.equal(defaults.rate1, parseInt(await crowdsale.getRate()));
151+
152+
await increaseTimeTestRPCTo(end1 - 2);
153+
assert.equal(defaults.rate1, parseInt(await crowdsale.getRate()),
154+
'rate should still be rate1 close but before end1 timestamp');
155+
156+
await increaseTimeTestRPCTo(end1 + 1);
157+
assert.equal(defaults.rate2, parseInt(await crowdsale.getRate()),
158+
'rate should be rate 2 between end1 and end2');
159+
160+
await increaseTimeTestRPCTo(end2 - 2);
161+
assert.equal(defaults.rate2, parseInt(await crowdsale.getRate()),
162+
'rate should be rate 2 close but before end2 timestamp');
163+
164+
await increaseTimeTestRPCTo(end2 + 1);
165+
assert.equal(0, parseInt(await crowdsale.getRate()),
166+
'rate should be 0 after end2 timestamp');
167+
});
168+
169+
/// buyTokens
170+
171+
it('handles a buyTokens tx fine', async function() {
172+
const crowdsale = await createCrowdsale({});
173+
await crowdsale.setWeiPerUSDinTGE(10000);
174+
await increaseTimeTestRPCTo(latestTime() + defaultTimeDelta + 2);
175+
await crowdsale.buyTokens(accounts[6], {value: 1000, from: accounts[5]});
176+
177+
assert.equal(1000, await crowdsale.purchases(accounts[6]));
178+
});
179+
180+
it('fails on buyTokens from address(0)', async function() {
181+
const crowdsale = await createCrowdsale({});
182+
await crowdsale.setWeiPerUSDinTGE(10000);
183+
await increaseTimeTestRPCTo(latestTime() + defaultTimeDelta + 2);
184+
try {
185+
await crowdsale.buyTokens(help.zeroAddress, {value: 1000, from: accounts[5]});
186+
assert(false, 'should have thrown');
187+
} catch(e) {
188+
assert(help.isInvalidOpcodeEx(e));
189+
}
190+
});
191+
192+
/// addPrivatePresaleTokens
193+
it('handles an addPrivatePresaleTokens tx fine', async function() {
194+
const crowdsale = await createCrowdsale({}),
195+
rate = defaults.rate1 + 10,
196+
token = LifToken.at(await crowdsale.token());
197+
198+
await crowdsale.setWeiPerUSDinTGE(10000);
199+
await crowdsale.addPrivatePresaleTokens(accounts[3], 1000, rate,
200+
{from: accounts[0]});
201+
202+
assert.equal(1000 * rate, parseInt(await token.balanceOf(accounts[3])),
203+
'should mint the tokens to beneficiary on addPrivatePresaleTokens');
204+
});
205+
206+
it('fails on a addPrivatePresaleTokens tx with address(0) as benef.', async function() {
207+
const crowdsale = await createCrowdsale({}),
208+
rate = defaults.rate1 + 10;
209+
210+
await crowdsale.setWeiPerUSDinTGE(10000);
211+
try {
212+
await crowdsale.addPrivatePresaleTokens(help.zeroAddress, 1000, rate,
213+
{from: accounts[0]});
214+
assert(false);
215+
} catch(e) {
216+
assert(help.isInvalidOpcodeEx(e));
217+
}
218+
});
219+
220+
it('fails on a addPrivatePresaleTokens tx with low rate', async function() {
221+
const crowdsale = await createCrowdsale({}),
222+
rate = defaults.rate1 - 10;
223+
224+
await crowdsale.setWeiPerUSDinTGE(10000);
225+
try {
226+
await crowdsale.addPrivatePresaleTokens(accounts[3], 1000, rate,
227+
{from: accounts[0]});
228+
assert(false);
229+
} catch(e) {
230+
assert(help.isInvalidOpcodeEx(e));
231+
}
232+
});
233+
234+
it('fails on a addPrivatePresaleTokens tx with weiSent == 0', async function() {
235+
const crowdsale = await createCrowdsale({}),
236+
rate = defaults.rate1 + 10;
237+
238+
await crowdsale.setWeiPerUSDinTGE(10000);
239+
try {
240+
await crowdsale.addPrivatePresaleTokens(accounts[3], 0, rate,
241+
{from: accounts[0]});
242+
assert(false);
243+
} catch(e) {
244+
assert(help.isInvalidOpcodeEx(e));
245+
}
246+
});
124247
});

0 commit comments

Comments
 (0)