-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathassocArrays.js
146 lines (129 loc) · 4.62 KB
/
assocArrays.js
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
/*
tests-settings.json:
{
"hostname": "localhost",
"user": "test",
"password": "test"
}
*/
var nodeunit = require("nodeunit");
var oracle = require("../");
var settings;
try {
settings = JSON.parse(require('fs').readFileSync('./tests-settings-custom.json', 'utf8'));
} catch (ex) {}
settings = settings || JSON.parse(require('fs').readFileSync('./tests-settings.json', 'utf8'));
function initDb(connection, cb) {
// Create the TEST_PKG for the test (first spec then body).
var spec = '\
CREATE OR REPLACE PACKAGE "TEST_PKG" IS \
TYPE Y_STRINGS_TABLE IS TABLE OF NVARCHAR2(4000) INDEX BY PLS_INTEGER; \
TYPE Y_NUMBERS_TABLE IS TABLE OF NUMBER INDEX BY PLS_INTEGER; \
PROCEDURE sp_get_numbers(i_arr Y_NUMBERS_TABLE, o_out OUT sys_refcursor); \
PROCEDURE sp_get_strings(i_arr Y_STRINGS_TABLE, o_out OUT sys_refcursor); \
END test_pkg;'
var body = '\
CREATE OR REPLACE PACKAGE BODY "TEST_PKG" IS \
PROCEDURE sp_get_numbers(i_arr Y_NUMBERS_TABLE, o_out OUT sys_refcursor) IS \
vals sys.ODCINumberList := sys.ODCINumberList(); \
BEGIN \
FOR i IN i_arr.first..i_arr.last LOOP \
vals.extend(1); \
vals(i) := i_arr(i); \
END LOOP; \
OPEN o_out FOR SELECT * FROM TABLE(vals); \
END; \
PROCEDURE sp_get_strings(i_arr Y_STRINGS_TABLE, o_out OUT sys_refcursor) IS \
vals sys.ODCIVarchar2List := sys.ODCIVarchar2List(); \
BEGIN \
FOR i IN i_arr.first..i_arr.last LOOP \
vals.extend(1); \
vals(i) := i_arr(i); \
END LOOP; \
OPEN o_out FOR SELECT * FROM TABLE(vals); \
END; \
END test_pkg;';
connection.execute(spec, [], function(err) {
if (err) throw err;
connection.execute(body, [], function(err) {
if (err) throw err;
cb();
});
});
}
exports['AssocArrays'] = nodeunit.testCase({
setUp: function(callback) {
var self = this;
oracle.connect(settings, function(err, connection) {
if (err) return callback(err);
self.connection = connection;
initDb(self.connection, callback);
});
},
tearDown: function(callback) {
if (this.connection) {
this.connection.close();
}
callback();
},
"AssocArrays - Select using a numbers array": function(test) {
var out = new oracle.OutParam(oracle.OCCICURSOR);
var arr = [12.453, -98.31, -5, 5, 3.876e123, -3.876e123];
this.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {
if(err) { console.error(err); return; }
test.equal(results.returnParam.length, arr.length);
// Loop thru all the values we passed and check that we got them back.
// Due to floating point precision (and exponential notation) we are testing
// that they are "close enough".
arr.forEach(function(val, i) {
var res = results.returnParam[i]['COLUMN_VALUE'];
test.ok(Math.abs(res/val - 1) < 0.001, 'Expected: ' + val + ' Got: ' + res);
});
test.done();
});
},
"AssocArrays - Select using too big positive number": function(test) {
var out = new oracle.OutParam(oracle.OCCICURSOR);
var arr = [12.453, Number.MAX_VALUE, -5, 5, 0];
var self = this;
test.throws(function(){
self.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {});
});
test.done();
},
"AssocArrays - Select using too big negative number": function(test) {
var out = new oracle.OutParam(oracle.OCCICURSOR);
var arr = [12.453, -1*Number.MAX_VALUE, -5, 5, 0];
var self = this;
test.throws(function(){
self.connection.execute('Begin TEST_PKG.sp_get_numbers(:1, :2); End;', [arr, out], function(err, results) {});
});
test.done();
},
"AssocArrays - Select using strings": function(test) {
var out = new oracle.OutParam(oracle.OCCICURSOR);
var arr = ['1234567890', 'ThE ', 'quick ', ' BrOwN ','fox' ,'Ju m p s', '!!!', 'noo ??', '~!@#$%^&*()_+', ''];
this.connection.execute('Begin TEST_PKG.sp_get_strings(:1, :2); End;', [arr, out], function(err, results) {
if(err) { console.error(err); return; }
test.equal(results.returnParam.length, arr.length);
arr.forEach(function(val, i) {
var res = results.returnParam[i]['COLUMN_VALUE'] || '';
test.equal(res, val);
});
test.done();
});
},
"AssocArrays - Select using UTF8 strings": function(test) {
var out = new oracle.OutParam(oracle.OCCICURSOR);
var arr = ['тест', ' тест ', '12тест34', 'AB тест'];
this.connection.execute('Begin TEST_PKG.sp_get_strings(:1, :2); End;', [arr, out], function(err, results) {
if(err) { console.error(err); return; }
test.equal(results.returnParam.length, arr.length);
arr.forEach(function(val, i) {
var res = results.returnParam[i]['COLUMN_VALUE'] || '';
test.equal(res, val);
});
test.done();
});
}
});