|
|
@ -4,87 +4,145 @@ import ( |
|
|
|
"testing" |
|
|
|
"testing" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func TestNotice(t *testing.T) { |
|
|
|
func makeUserdoc(desc string) []byte { |
|
|
|
|
|
|
|
return []byte(` |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
"source": "...", |
|
|
|
|
|
|
|
"language": "Solidity", |
|
|
|
|
|
|
|
"languageVersion": 1, |
|
|
|
|
|
|
|
"methods": { |
|
|
|
|
|
|
|
"multiply(uint256)": { |
|
|
|
|
|
|
|
"notice": ` + desc + ` |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
"balance(address)": { |
|
|
|
|
|
|
|
"notice": "` + "`(balanceInmGAV / 1000).fixed(0,3)`" + ` GAV is the total funds available to ` + "`who.address()`." + ` |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
"invariants": [ |
|
|
|
|
|
|
|
{ "notice": "The sum total amount of GAV in the system is 1 million." } |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
"construction": [ |
|
|
|
|
|
|
|
{ "notice": "Endows ` + "`message.caller.address()`" + ` with 1m GAV." } |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
`) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
tx := ` |
|
|
|
var data = "0xc6888fa1000000000000000000000000000000000000000000000000000000000000007a" |
|
|
|
{ |
|
|
|
|
|
|
|
"jsonrpc": "2.0", |
|
|
|
var tx = ` |
|
|
|
"method": "eth_call", |
|
|
|
{ |
|
|
|
"params": [{ |
|
|
|
"jsonrpc": "2.0", |
|
|
|
"to": "0x8521742d3f456bd237e312d6e30724960f72517a", |
|
|
|
"method": "eth_call", |
|
|
|
"data": "0xc6888fa1000000000000000000000000000000000000000000000000000000000000007a" |
|
|
|
"params": [{ |
|
|
|
}], |
|
|
|
"to": "0x8521742d3f456bd237e312d6e30724960f72517a", |
|
|
|
"id": 6 |
|
|
|
"data": "0xc6888fa1000000000000000000000000000000000000000000000000000000000000007a" |
|
|
|
} |
|
|
|
}], |
|
|
|
` |
|
|
|
"id": 6 |
|
|
|
|
|
|
|
} |
|
|
|
abi := ` |
|
|
|
` |
|
|
|
[{ |
|
|
|
|
|
|
|
"name": "multiply", |
|
|
|
var abi = []byte(` |
|
|
|
"constant": false, |
|
|
|
[{ |
|
|
|
"type": "function", |
|
|
|
"name": "multiply", |
|
|
|
"inputs": [{ |
|
|
|
"constant": false, |
|
|
|
"name": "a", |
|
|
|
"type": "function", |
|
|
|
"type": "uint256" |
|
|
|
"inputs": [{ |
|
|
|
}], |
|
|
|
"name": "a", |
|
|
|
"outputs": [{ |
|
|
|
"type": "uint256" |
|
|
|
"name": "d", |
|
|
|
}], |
|
|
|
"type": "uint256" |
|
|
|
"outputs": [{ |
|
|
|
}] |
|
|
|
"name": "d", |
|
|
|
|
|
|
|
"type": "uint256" |
|
|
|
}] |
|
|
|
}] |
|
|
|
` |
|
|
|
}] |
|
|
|
|
|
|
|
`) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func TestNotice(t *testing.T) { |
|
|
|
|
|
|
|
|
|
|
|
desc := "Will multiply `a` by 7 and return `a * 7`." |
|
|
|
desc := "Will multiply `a` by 7 and return `a * 7`." |
|
|
|
|
|
|
|
expected := "Will multiply 122 by 7 and return 854." |
|
|
|
|
|
|
|
|
|
|
|
method := "multiply" |
|
|
|
userdoc := makeUserdoc(desc) |
|
|
|
|
|
|
|
|
|
|
|
ns, err := New() |
|
|
|
ns, err := NewWithDocs(abi, userdoc) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
t.Errorf("NewNATSpec error %v", err) |
|
|
|
t.Errorf("New: error: %v", err) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
notice, err := ns.Notice(tx, abi, method, desc) |
|
|
|
notice, err := ns.Notice(tx, desc) |
|
|
|
|
|
|
|
|
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
t.Errorf("expected no error got %v", err) |
|
|
|
t.Errorf("expected no error, got %v", err) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
expected := "Will multiply 122 by 7 and return 854." |
|
|
|
|
|
|
|
if notice != expected { |
|
|
|
if notice != expected { |
|
|
|
t.Errorf("incorrect notice. expected %v, got %v", expected, notice) |
|
|
|
t.Errorf("incorrect notice. expected %v, got %v", expected, notice) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
t.Logf("returned notice \"%v\"", notice) |
|
|
|
t.Logf("returned notice \"%v\"", notice) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
notice, err = ns.Notice(tx, abi, method, "Will multiply 122 by \"7\" and return 854.") |
|
|
|
// test missing method
|
|
|
|
|
|
|
|
func TestMissingMethod(t *testing.T) { |
|
|
|
|
|
|
|
|
|
|
|
expected = "natspec.js error setting expression: (anonymous): Line 1:41 Unexpected number" |
|
|
|
desc := "Will multiply `a` by 7 and return `a * 7`." |
|
|
|
|
|
|
|
userdoc := makeUserdoc(desc) |
|
|
|
|
|
|
|
expected := "natspec.js error evaluating expression: Natspec evaluation failed, method does not exist" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ns, err := NewWithDocs(abi, userdoc) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
t.Errorf("New: error: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
notice, err := ns.noticeForMethod(tx, "missing_method", "") |
|
|
|
|
|
|
|
|
|
|
|
if err == nil { |
|
|
|
if err == nil { |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", err, notice) |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", notice) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if err.Error() != expected { |
|
|
|
if err.Error() != expected { |
|
|
|
t.Errorf("expected error '%s' got '%v' (notice: '%v')", expected, err, notice) |
|
|
|
t.Errorf("expected error '%s' got '%v' (notice: '%v')", expected, err, notice) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// https://github.com/ethereum/natspec.js/issues/1
|
|
|
|
// test invalid desc
|
|
|
|
badDesc := "Will multiply `e` by 7 and return `a * 7`." |
|
|
|
func TestInvalidDesc(t *testing.T) { |
|
|
|
notice, err = ns.Notice(tx, abi, method, badDesc) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expected = "natspec.js error evaluating expression: Natspec evaluation failed, wrong input params" |
|
|
|
desc := "Will multiply 122 by \"7\" and return 854." |
|
|
|
|
|
|
|
expected := "natspec.js error setting expression: (anonymous): Line 1:41 Unexpected number" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
userdoc := makeUserdoc(desc) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ns, err := NewWithDocs(abi, userdoc) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
t.Errorf("New: error: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
notice, err := ns.Notice(tx, data) |
|
|
|
|
|
|
|
|
|
|
|
if err == nil { |
|
|
|
if err == nil { |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", notice) |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", err, notice) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
if err.Error() != expected { |
|
|
|
if err.Error() != expected { |
|
|
|
t.Errorf("expected error '%s' got '%v' (notice: '%v')", expected, err, notice) |
|
|
|
t.Errorf("expected error '%s' got '%v' (notice: '%v')", expected, err, notice) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// test wrong input params
|
|
|
|
|
|
|
|
func TestWrongInputParams(t *testing.T) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
desc := "Will multiply `e` by 7 and return `a * 7`." |
|
|
|
|
|
|
|
expected := "natspec.js error evaluating expression: Natspec evaluation failed, wrong input params" |
|
|
|
|
|
|
|
|
|
|
|
notice, err = ns.Notice(tx, abi, "missing_method", desc) |
|
|
|
userdoc := makeUserdoc(desc) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ns, err := NewWithDocs(abi, userdoc) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
t.Errorf("New: error: %v", err) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
expected = "natspec.js error evaluating expression: Natspec evaluation failed, method does not exist" |
|
|
|
notice, err := ns.Notice(tx, desc) |
|
|
|
|
|
|
|
|
|
|
|
if err == nil { |
|
|
|
if err == nil { |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", notice) |
|
|
|
t.Errorf("expected error, got nothing (notice: '%v')", notice) |
|
|
|