File: dates.rb

package info (click to toggle)
quantlib-ruby 0.2.1.cvs20020322-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 972 kB
  • ctags: 1,309
  • sloc: cpp: 16,141; ruby: 2,578; makefile: 59
file content (194 lines) | stat: -rw-r--r-- 5,559 bytes parent folder | download
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
=begin
 Copyright (C) 2000, 2001, 2002 RiskMap srl

 This file is part of QuantLib, a free-software/open-source library
 for financial quantitative analysts and developers - http://quantlib.org/

 QuantLib is free software: you can redistribute it and/or modify it under the
 terms of the QuantLib license.  You should have received a copy of the
 license along with this program; if not, please email ferdinando@ametrano.net
 The license is also available online at http://quantlib.org/html/license.html

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the license for more details.
=end

# $Id: dates.rb,v 1.5 2002/01/16 15:17:06 nando Exp $

require 'QuantLib'
require 'runit/testcase'
require 'runit/cui/testrunner'

class DateTest < RUNIT::TestCase
    def name
        "Testing dates..."
    end
    def test
        minDate = QuantLib::Date.minDate.serialNumber
        maxDate = QuantLib::Date.maxDate.serialNumber

        dyold  = QuantLib.DateFromSerialNumber(minDate-1).dayOfYear
        dold   = QuantLib.DateFromSerialNumber(minDate-1).dayOfMonth
        mold   = QuantLib.DateFromSerialNumber(minDate-1).monthNumber
        yold   = QuantLib.DateFromSerialNumber(minDate-1).year
        wdnold = QuantLib.DateFromSerialNumber(minDate-1).weekdayNumber

        minDate.upto(maxDate) { |i|
            t = QuantLib.DateFromSerialNumber(i)
            # check serial number consistency
            unless t.serialNumber == i
                assert_fail(<<-MESSAGE

    inconsistent serial number:
        original:      #{i}
        date:          #{t}
        serial number: #{t.serialNumber}

                    MESSAGE
                )
            end

            dy  = t.dayOfYear
            d   = t.dayOfMonth
            m   = t.monthNumber
            y   = t.year
            mm  = t.month
            wd  = t.weekday
            wdn = t.weekdayNumber

            # check if skipping any date
            unless dy==dyold+1 \
                or (dy==1 and dyold==365 and not QuantLib::Date.isLeap(yold)) \
                or (dy==1 and dyold==366 and QuantLib::Date.isLeap(yold))
                    assert_fail(<<-MESSAGE

    wrong day of year increment:
        date: #{t}
        day of year: #{dy}
        previous:    #{dyold}

                        MESSAGE
                    )
            end
            dyold = dy

            # check if skipping any date
            unless (d==dold+1 and m==mold   and y==yold  ) \
                or (d==1      and m==mold+1 and y==yold  ) \
                or (d==1      and m==1      and y==yold+1)
                    assert_fail(<<-MESSAGE

    wrong day, month, year increment
        date: #{t}
        day, month, year: #{d}, #{m}, #{y}
        previous:         #{dold}, #{mold}, #yold}

                        MESSAGE
                    )
            end
            dold = d
            mold = m
            yold = y

            # check month definition
            unless m>=1 and m<=12
                assert_fail(<<-MESSAGE

    invalid month
        date: #{t}
        month: #{m}

                    MESSAGE
                )
            end

            # check day definition
            unless d >= 1
                assert_fail(<<-MESSAGE

    invalid day of month
        date: #{t}
        day: #{d}

                    MESSAGE
                )
            end

            unless (m==1  and d<=31) \
                or (m==2  and d<=28) \
                or (m==2  and d==29 and QuantLib::Date.isLeap(y)) \
                or (m==3  and d<=31) \
                or (m==4  and d<=30) \
                or (m==5  and d<=31) \
                or (m==6  and d<=30) \
                or (m==7  and d<=31) \
                or (m==8  and d<=31) \
                or (m==9  and d<=30) \
                or (m==10 and d<=31) \
                or (m==11 and d<=30) \
                or (m==12 and d<=31)
                    assert_fail(<<-MESSAGE

    invalid day of month
        date: #{t}
        day: #{d}
        month: #{mm}

                        MESSAGE
                    )
            end

            # check weekdayNumber definition
            unless wdn==wdnold+1 or (wdn==1 and wdnold==7)
                assert_fail(<<-MESSAGE

    wrong weekday number increment
        date: #{t}
        weekday number: #{wdn}
        previous:       #{wdnold}

                    MESSAGE
                )
            end
            wdnold=wdn

            # create the same date with a different constructor
            s = QuantLib::Date.new(d,m,y)
            # check serial number consistency
            unless s.serialNumber == i
                assert_fail(<<-MESSAGE

    inconsistent serial number
        date: #{t}
        serial number: #{i}
        cloned date: #{s}
        serial number: #{s.serialNumber}

                    MESSAGE
                )
            end

            # create the same date with yet another constructor
            s = QuantLib::Date.new(d,mm,y)
            # check serial number consistency
            unless s.serialNumber == i
                assert_fail(<<-MESSAGE

    inconsistent serial number
        date: #{t}
        serial number: #{i}
        cloned date: #{s}
        serial number: #{s.serialNumber}

                    MESSAGE
                )
            end
        }
    end
end

if $0 == __FILE__
    RUNIT::CUI::TestRunner.run(DateTest.suite)
end