github.com/igggame/nebulas-go@v2.1.0+incompatible/nf/nvm/test/instruction_counter_tests/for.js (about) 1 // Copyright (C) 2017 go-nebulas authors 2 // 3 // This file is part of the go-nebulas library. 4 // 5 // the go-nebulas library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // the go-nebulas library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with the go-nebulas library. If not, see <http://www.gnu.org/licenses/>. 17 // 18 19 const assert = require('assert.js'); 20 21 function assertEqual(func, args, expected, expected_count, msg) { 22 const count_of_helper_statement = 46; 23 var count = _instruction_counter.count; 24 assert.equal(func.apply(null, args), expected); 25 assert.equal(_instruction_counter.count - count - count_of_helper_statement, expected_count, msg); 26 }; 27 28 // test1. 29 var test1 = function (x) { 30 var ret = 0; 31 for (var i = 0; i < x; i++) 32 ret += i; 33 return ret; 34 }; 35 assertEqual(test1, [0], 0, 3); 36 assertEqual(test1, [10], 45, 10 * (9+1) + 3); 37 assertEqual(test1, [11], 55, 11 * (9 + 1) + 3); 38 assertEqual(test1, [23], 253, 23 * (9 + 1) + 3); 39 40 // test2. 41 var test2 = function (x) { 42 var ret = 0; 43 for (var i = 0; i < x && i < 20; ret++, i++) { 44 ret += i; 45 } 46 return ret; 47 } 48 assertEqual(test2, [10], 55, 10 * (18 + 1) + 9); 49 assertEqual(test2, [11], 66, 11 * (18 +1 ) + 9); 50 assertEqual(test2, [20], 210, 20 * (18 + 1) + 9); 51 assertEqual(test2, [23], 210, 20 * (18 + 1) + 9); 52 53 // test3. 54 var test3 = function (x) { 55 var ret = 0; 56 for (var i = 0; i < x; ret++, i++) { 57 ret += i; 58 if (i % 2 == 0) { 59 continue; 60 } 61 ret += 1; 62 } 63 return ret; 64 } 65 assertEqual(test3, [1], 1, 1 * (18 + 1) + 3); 66 assertEqual(test3, [10], 60, 10 * (18 + 1) + 3 + 10 / 2 * 3); 67 assertEqual(test3, [11], 71, 11 * (18 + 1) + 3 + Math.floor(11 / 2) * 3); 68 assertEqual(test3, [12], 84, 12 * (18 + 1) + 3 + Math.floor(12 / 2) * 3); 69 70 // test4. 71 var gen4X = function (a) { 72 var x = new Array(); 73 for (var i = 0; i < a; i++) { 74 x.push(i + 1); 75 } 76 return x; 77 }; 78 var test4 = function (x) { 79 var ret = 0; 80 for (var i in x) { 81 ret += x[i]; 82 } 83 return ret; 84 }; 85 assertEqual(test4, [gen4X(0)], 0, 0); 86 assertEqual(test4, [gen4X(1)], 1, 9 * 1); 87 assertEqual(test4, [gen4X(2)], 3, 9 * 2); 88 assertEqual(test4, [gen4X(3)], 6, 9 * 3); 89 90 // test5. 91 var gen5X = function (a) { 92 var x = new Object(); 93 for (var i = 0; i < a; i++) { 94 x[i] = i + 1; 95 } 96 return x; 97 } 98 var test5 = function (x) { 99 var ret = 0; 100 for (var i in x) 101 ret += x[i]; 102 return ret; 103 }; 104 assertEqual(test5, [gen5X(0)], 0, 0); 105 assertEqual(test5, [gen5X(1)], 1, 9 * 1); 106 assertEqual(test5, [gen5X(2)], 3, 9 * 2); 107 assertEqual(test5, [gen5X(10)], 55, 9 * 10); 108 109 // test6. 110 var gen6X = function (a) { 111 var x = new Map(); 112 for (var i = 0; i < a; i++) { 113 x.set(i, i + 1); 114 } 115 return x; 116 }; 117 var test6 = function (x) { 118 var ret = 0; 119 for (var i of x.values()) 120 ret += i; 121 return ret; 122 }; 123 assertEqual(test6, [gen6X(0)], 0, 12); 124 assertEqual(test6, [gen6X(1)], 1, 5 * 1 + 12); 125 assertEqual(test6, [gen6X(2)], 3, 5 * 2 + 12); 126 assertEqual(test6, [gen6X(10)], 55, 5 * 10 + 12);