nasl 0.0.8 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/README.md +11 -16
  4. data/Rakefile +38 -0
  5. data/bin/nasl-parse +1 -1
  6. data/lib/nasl.rb +1 -1
  7. data/lib/nasl/cli.rb +1 -1
  8. data/lib/nasl/command.rb +1 -1
  9. data/lib/nasl/commands/benchmark.rb +1 -1
  10. data/lib/nasl/commands/parse.rb +1 -1
  11. data/lib/nasl/commands/test.rb +1 -1
  12. data/lib/nasl/commands/tokenize.rb +1 -1
  13. data/lib/nasl/commands/xml.rb +1 -1
  14. data/lib/nasl/context.rb +5 -5
  15. data/lib/nasl/grammar.racc +104 -16
  16. data/lib/nasl/parser.rb +1 -1
  17. data/lib/nasl/parser/argument.rb +1 -1
  18. data/lib/nasl/parser/array.rb +51 -0
  19. data/lib/nasl/parser/assigment.rb +1 -1
  20. data/lib/nasl/parser/block.rb +7 -1
  21. data/lib/nasl/parser/break.rb +2 -2
  22. data/lib/nasl/parser/call.rb +3 -2
  23. data/lib/nasl/parser/comment.rb +2 -2
  24. data/lib/nasl/parser/continue.rb +2 -2
  25. data/lib/nasl/parser/decrement.rb +1 -1
  26. data/lib/nasl/parser/empty.rb +2 -2
  27. data/lib/nasl/parser/export.rb +1 -1
  28. data/lib/nasl/parser/expression.rb +1 -1
  29. data/lib/nasl/parser/for.rb +2 -2
  30. data/lib/nasl/parser/foreach.rb +4 -4
  31. data/lib/nasl/parser/function.rb +1 -1
  32. data/lib/nasl/parser/global.rb +1 -1
  33. data/lib/nasl/parser/identifier.rb +7 -2
  34. data/lib/nasl/parser/if.rb +2 -2
  35. data/lib/nasl/parser/import.rb +1 -1
  36. data/lib/nasl/parser/include.rb +2 -2
  37. data/lib/nasl/parser/increment.rb +1 -1
  38. data/lib/nasl/parser/integer.rb +7 -2
  39. data/lib/nasl/parser/ip.rb +2 -2
  40. data/lib/nasl/parser/key_value_pair.rb +43 -0
  41. data/lib/nasl/parser/list.rb +41 -0
  42. data/lib/nasl/parser/local.rb +1 -1
  43. data/lib/nasl/parser/lvalue.rb +1 -1
  44. data/lib/nasl/parser/node.rb +2 -2
  45. data/lib/nasl/parser/parameter.rb +43 -0
  46. data/lib/nasl/parser/reference.rb +41 -0
  47. data/lib/nasl/parser/repeat.rb +1 -1
  48. data/lib/nasl/parser/repetition.rb +1 -1
  49. data/lib/nasl/parser/return.rb +2 -2
  50. data/lib/nasl/parser/string.rb +7 -2
  51. data/lib/nasl/parser/tree.rb +2 -2
  52. data/lib/nasl/parser/undefined.rb +2 -2
  53. data/lib/nasl/parser/while.rb +1 -1
  54. data/lib/nasl/test.rb +1 -1
  55. data/lib/nasl/token.rb +2 -2
  56. data/lib/nasl/tokenizer.rb +7 -4
  57. data/lib/nasl/version.rb +27 -1
  58. data/nasl.gemspec +35 -8
  59. data/test/unit/parser/test_array.rb +174 -0
  60. data/test/unit/parser/test_assignment.rb +75 -4
  61. data/test/unit/parser/test_blank.rb +1 -1
  62. data/test/unit/parser/test_block.rb +29 -1
  63. data/test/unit/parser/test_call.rb +57 -5
  64. data/test/unit/parser/test_comment.rb +1 -1
  65. data/test/unit/parser/test_constant.rb +1 -1
  66. data/test/unit/parser/test_empty.rb +1 -1
  67. data/test/unit/parser/test_expressions.rb +8 -1
  68. data/test/unit/parser/test_foreach.rb +43 -0
  69. data/test/unit/parser/test_function.rb +147 -51
  70. data/test/unit/parser/test_global.rb +49 -0
  71. data/test/unit/parser/test_if.rb +3 -3
  72. data/test/unit/parser/test_include.rb +1 -1
  73. data/test/unit/parser/test_incr_decr.rb +1 -1
  74. data/test/unit/parser/test_ip.rb +1 -1
  75. data/test/unit/parser/test_list.rb +42 -0
  76. data/test/unit/parser/test_local.rb +49 -0
  77. data/test/unit/parser/test_return.rb +7 -3
  78. data/test/unit/parser/test_string.rb +1 -1
  79. data/test/unit/parser/test_whitespace.rb +1 -1
  80. data/test/unit/test_context.rb +1 -1
  81. data/test/unit/tokenizer/test_comment.rb +1 -1
  82. data/test/unit/tokenizer/test_empty.rb +1 -1
  83. data/test/unit/tokenizer/test_integer.rb +1 -1
  84. data/test/unit/tokenizer/test_references.rb +41 -0
  85. data/test/unit/tokenizer/test_string.rb +2 -1
  86. metadata +49 -86
@@ -0,0 +1,41 @@
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice, this
9
+ # list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ ################################################################################
26
+
27
+ require 'nasl/parser/node'
28
+
29
+ module Nasl
30
+ class Reference < Node
31
+ attr_reader :name
32
+
33
+ def initialize(tree, *tokens)
34
+ super
35
+
36
+ @name = @tokens[0]
37
+
38
+ @children << :name
39
+ end
40
+ end
41
+ end
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -22,7 +22,7 @@
22
22
  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
23
  # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
24
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
- ################################################################################
25
+ ###############################################################################
26
26
 
27
27
  require 'nasl/parser/node'
28
28
 
@@ -1,5 +1,5 @@
1
- !################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -28,6 +28,7 @@ require 'nasl/parser/node'
28
28
 
29
29
  module Nasl
30
30
  class String < Node
31
+ include Comparable
31
32
  attr_reader :text, :type
32
33
 
33
34
  def initialize(tree, *tokens)
@@ -37,6 +38,10 @@ module Nasl
37
38
  @type = @tokens.first.type
38
39
  end
39
40
 
41
+ def <=>(other)
42
+ self.text <=> other.text
43
+ end
44
+
40
45
  def to_xml(xml)
41
46
  xml.method_missing(@type.downcase, @text)
42
47
  end
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,7 @@
27
27
  require 'builder'
28
28
 
29
29
  module Nasl
30
- class Tree < Array
30
+ class Tree < ::Array
31
31
  def all(cls)
32
32
  (@all[Nasl.const_get(cls).to_s] ||= [])
33
33
  end
@@ -1,5 +1,5 @@
1
- !################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
1
  ################################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
- ###############################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -1,5 +1,5 @@
1
- ###############################################################################
2
- # Copyright (c) 2011-2012, Mak Kolybabi
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without
@@ -42,6 +42,7 @@ module Nasl
42
42
  'global_var' => :GLOBAL,
43
43
  'if' => :IF,
44
44
  'import' => :IMPORT,
45
+ 'in' => :IN,
45
46
  'include' => :INCLUDE,
46
47
  'local_var' => :LOCAL,
47
48
  'repeat' => :REPEAT,
@@ -83,7 +84,6 @@ module Nasl
83
84
 
84
85
  ["|", :BIT_OR],
85
86
  ["^", :BIT_XOR],
86
- ["&", :BIT_AND],
87
87
  [">>>", :BIT_SRA],
88
88
  [">>", :BIT_SRL],
89
89
  ["<<", :BIT_SLL],
@@ -113,7 +113,10 @@ module Nasl
113
113
  ["[", :LBRACK],
114
114
  ["]", :RBRACK],
115
115
  ["{", :LBRACE],
116
- ["}", :RBRACE]
116
+ ["}", :RBRACE],
117
+
118
+ ["&", :AMPERSAND],
119
+ ["@", :AT_SIGN]
117
120
  ]
118
121
 
119
122
  @@annotated = [
@@ -1,3 +1,29 @@
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice, this
9
+ # list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ ################################################################################
26
+
1
27
  module Nasl
2
- VERSION = '0.0.8'
28
+ VERSION = '0.1.1'
3
29
  end
@@ -1,4 +1,31 @@
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice, this
9
+ # list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ ################################################################################
26
+
1
27
  # -*- encoding: utf-8 -*-
28
+
2
29
  $:.push File.expand_path('../lib', __FILE__)
3
30
 
4
31
  require 'nasl/version'
@@ -8,11 +35,11 @@ Gem::Specification.new do |s|
8
35
  s.version = Nasl::VERSION
9
36
  s.license = 'BSD'
10
37
  s.homepage = 'http://github.com/tenable/nasl'
11
- s.summary = 'A parser for the Nessus Attack Scripting Language.'
12
- s.description = File.open('README.md').read
38
+ s.summary = 'A language parser for the Nessus Attack Scripting Language.'
39
+ s.description = 'A language parser for the Nessus Attack Scripting Language. Supporting NASL v5.2.'
13
40
 
14
- s.authors = ['Mak Kolybabi']
15
- s.email = ['mak@kolybabi.com']
41
+ s.authors = ['Mak Kolybabi', 'Alex Weber', 'Jacob Hammack']
42
+ s.email = ['mak@kolybabi.com', 'aweber@tenble.com', 'jhammack@tenable.com']
16
43
 
17
44
  s.rubyforge_project = 'nasl'
18
45
 
@@ -21,9 +48,9 @@ Gem::Specification.new do |s|
21
48
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
49
  s.require_paths = ['lib']
23
50
 
24
- s.add_development_dependency 'racc'
25
- s.add_development_dependency 'rake'
51
+ s.add_development_dependency 'racc', '~>1.4'
52
+ s.add_development_dependency 'rake', '~>10.1'
26
53
 
27
- s.add_runtime_dependency 'builder', '>= 3.1.4'
28
- s.add_runtime_dependency 'rainbow'
54
+ s.add_runtime_dependency 'builder', '~> 3.1'
55
+ s.add_runtime_dependency 'rainbow', '~> 2.0'
29
56
  end
@@ -0,0 +1,174 @@
1
+ ################################################################################
2
+ # Copyright (c) 2011-2014, Tenable Network Security
3
+ # All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # 1. Redistributions of source code must retain the above copyright notice, this
9
+ # list of conditions and the following disclaimer.
10
+ #
11
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ ################################################################################
26
+
27
+ class TestArray < Test::Unit::TestCase
28
+ include Nasl::Test
29
+
30
+ def test_empty
31
+ tree = parse("foo = {};")
32
+ assert_not_nil(tree)
33
+
34
+ arrays = tree.all(:Array)
35
+ assert_not_nil(arrays)
36
+ assert_equal(1, arrays.length)
37
+
38
+ array = arrays.first
39
+ assert_not_nil(array)
40
+ assert_equal(0, array.pairs.length)
41
+ end
42
+
43
+ def test_integers
44
+ tree = parse("foo = {1:02, 3:4, 5:0x6};")
45
+ assert_not_nil(tree)
46
+
47
+ arrays = tree.all(:Array)
48
+ assert_not_nil(arrays)
49
+ assert_equal(1, arrays.length)
50
+
51
+ array = arrays.first
52
+ assert_not_nil(array)
53
+ assert_equal(3, array.pairs.length)
54
+
55
+ assert_equal(1, array.pairs[0].key.value)
56
+ assert_equal(array.keys[1], array.pairs[0].value)
57
+ pair = array.pairs[0]
58
+ assert(pair.key.is_a? Nasl::Integer)
59
+ assert(pair.value.is_a? Nasl::Integer)
60
+ assert_equal(2, pair.value.value)
61
+
62
+ assert_equal(3, array.pairs[1].key.value)
63
+ assert_equal(array.keys[3], array.pairs[1].value)
64
+ pair = array.pairs[1]
65
+ assert(pair.key.is_a? Nasl::Integer)
66
+ assert(pair.value.is_a? Nasl::Integer)
67
+ assert_equal(4, pair.value.value)
68
+
69
+ assert_equal(5, array.pairs[2].key.value)
70
+ assert_equal(array.keys[5], array.pairs[2].value)
71
+ pair = array.pairs[2]
72
+ assert(pair.key.is_a? Nasl::Integer)
73
+ assert(pair.value.is_a? Nasl::Integer)
74
+ assert_equal(6, pair.value.value)
75
+ end
76
+
77
+ def test_string
78
+ tree = parse(%q|foo = {'a':"b", "c":'d'};|)
79
+ assert_not_nil(tree)
80
+
81
+ arrays = tree.all(:Array)
82
+ assert_not_nil(arrays)
83
+ assert_equal(1, arrays.length)
84
+
85
+ array = arrays.first
86
+ assert_not_nil(array)
87
+ assert_equal(2, array.pairs.length)
88
+
89
+ pair = array.pairs[0]
90
+ assert(pair.key.is_a? Nasl::String)
91
+ assert_equal(:DATA, pair.key.type)
92
+ assert_equal('a', pair.key.text)
93
+ assert(pair.value.is_a? Nasl::String)
94
+ assert_equal(:STRING, pair.value.type)
95
+ assert_equal('b', pair.value.text)
96
+ assert_equal(pair.value, array.keys['a'])
97
+
98
+ pair = array.pairs[1]
99
+ assert(pair.key.is_a? Nasl::String)
100
+ assert_equal(:STRING, pair.key.type)
101
+ assert_equal('c', pair.key.text)
102
+ assert(pair.value.is_a? Nasl::String)
103
+ assert_equal(:DATA, pair.value.type)
104
+ assert_equal('d', pair.value.text)
105
+ assert_equal(pair.value, array.keys['c'])
106
+ end
107
+
108
+ def test_mixed
109
+ tree = parse(%q|foo = {'a':1, 2:"b"};|)
110
+ assert_not_nil(tree)
111
+
112
+ arrays = tree.all(:Array)
113
+ assert_not_nil(arrays)
114
+ assert_equal(1, arrays.length)
115
+
116
+ array = arrays.first
117
+ assert_not_nil(array)
118
+ assert_equal(2, array.pairs.length)
119
+
120
+ pair = array.pairs[0]
121
+ assert(pair.key.is_a? Nasl::String)
122
+ assert_equal(:DATA, pair.key.type)
123
+ assert_equal('a', pair.key.text)
124
+ assert(pair.value.is_a? Nasl::Integer)
125
+ assert_equal(1, pair.value.value)
126
+ assert_equal(pair.value, array.keys['a'])
127
+
128
+ pair = array.pairs[1]
129
+ assert(pair.key.is_a? Nasl::Integer)
130
+ assert_equal(2, pair.key.value)
131
+ assert(pair.value.is_a? Nasl::String)
132
+ assert_equal(:STRING, pair.value.type)
133
+ assert_equal('b', pair.value.text)
134
+ assert_equal(pair.value, array.keys[2])
135
+ end
136
+
137
+ # A single trailing comma in an array literal is valid, but multiple is not.
138
+ def test_single_trailing_comma
139
+ tree = parse(%q|foo = {'a':1, 2:"b",};|)
140
+ assert_not_nil(tree)
141
+
142
+ arrays = tree.all(:Array)
143
+ assert_not_nil(arrays)
144
+ assert_equal(1, arrays.length)
145
+
146
+ array = arrays.first
147
+ assert_not_nil(array)
148
+ assert_equal(2, array.pairs.length)
149
+
150
+ pair = array.pairs[0]
151
+ assert(pair.key.is_a? Nasl::String)
152
+ assert_equal(:DATA, pair.key.type)
153
+ assert_equal('a', pair.key.text)
154
+ assert(pair.value.is_a? Nasl::Integer)
155
+ assert_equal(1, pair.value.value)
156
+ assert_equal(pair.value, array.keys['a'])
157
+
158
+ pair = array.pairs[1]
159
+ assert(pair.key.is_a? Nasl::Integer)
160
+ assert_equal(2, pair.key.value)
161
+ assert(pair.value.is_a? Nasl::String)
162
+ assert_equal(:STRING, pair.value.type)
163
+ assert_equal('b', pair.value.text)
164
+ assert_equal(pair.value, array.keys[2])
165
+ end
166
+
167
+ def test_multiple_trailing_comma
168
+ fail_parse(%q|foo = {'a':1, 2:"b",,};|)
169
+ end
170
+
171
+ def test_empty_array_with_comma
172
+ fail_parse(%q|return {,};|)
173
+ end
174
+ end