1require 'psych/helper'
2require 'date'
3
4module Psych
5  class TestScalarScanner < TestCase
6    attr_reader :ss
7
8    def setup
9      super
10      @ss = Psych::ScalarScanner.new
11    end
12
13    def test_scan_time
14      { '2001-12-15T02:59:43.1Z' => Time.utc(2001, 12, 15, 02, 59, 43, 100000),
15        '2001-12-14t21:59:43.10-05:00' => Time.utc(2001, 12, 15, 02, 59, 43, 100000),
16        '2001-12-14 21:59:43.10 -5' => Time.utc(2001, 12, 15, 02, 59, 43, 100000),
17        '2001-12-15 2:59:43.10' => Time.utc(2001, 12, 15, 02, 59, 43, 100000),
18        '2011-02-24 11:17:06 -0800' => Time.utc(2011, 02, 24, 19, 17, 06)
19      }.each do |time_str, time|
20        assert_equal time, @ss.tokenize(time_str)
21      end
22    end
23
24    def test_scan_bad_time
25      [ '2001-12-15T02:59:73.1Z',
26        '2001-12-14t90:59:43.10-05:00',
27        '2001-92-14 21:59:43.10 -5',
28        '2001-12-15 92:59:43.10',
29        '2011-02-24 81:17:06 -0800',
30      ].each do |time_str|
31        assert_equal time_str, @ss.tokenize(time_str)
32      end
33    end
34
35    def test_scan_bad_dates
36      x = '2000-15-01'
37      assert_equal x, @ss.tokenize(x)
38
39      x = '2000-10-51'
40      assert_equal x, @ss.tokenize(x)
41
42      x = '2000-10-32'
43      assert_equal x, @ss.tokenize(x)
44    end
45
46    def test_scan_good_edge_date
47      x = '2000-1-31'
48      assert_equal Date.strptime(x, '%Y-%m-%d'), @ss.tokenize(x)
49    end
50
51    def test_scan_bad_edge_date
52      x = '2000-11-31'
53      assert_equal x, @ss.tokenize(x)
54    end
55
56    def test_scan_date
57      date = '1980-12-16'
58      token = @ss.tokenize date
59      assert_equal 1980, token.year
60      assert_equal 12, token.month
61      assert_equal 16, token.day
62    end
63
64    def test_scan_inf
65      assert_equal(1 / 0.0, ss.tokenize('.inf'))
66    end
67
68    def test_scan_minus_inf
69      assert_equal(-1 / 0.0, ss.tokenize('-.inf'))
70    end
71
72    def test_scan_nan
73      assert ss.tokenize('.nan').nan?
74    end
75
76    def test_scan_null
77      assert_equal nil, ss.tokenize('null')
78      assert_equal nil, ss.tokenize('~')
79      assert_equal nil, ss.tokenize('')
80    end
81
82    def test_scan_symbol
83      assert_equal :foo, ss.tokenize(':foo')
84    end
85
86    def test_scan_sexagesimal_float
87      assert_equal 685230.15, ss.tokenize('190:20:30.15')
88    end
89
90    def test_scan_sexagesimal_int
91      assert_equal 685230, ss.tokenize('190:20:30')
92    end
93
94    def test_scan_float
95      assert_equal 1.2, ss.tokenize('1.2')
96    end
97
98    def test_scan_true
99      assert_equal true, ss.tokenize('true')
100    end
101
102    def test_scan_strings_starting_with_underscores
103      assert_equal "_100", ss.tokenize('_100')
104    end
105  end
106end
107