LOCAL bPass bPass = .T. DO Test0 WITH m.bPass IF m.bPass THEN DO Test1 WITH m.bPass ENDIF IF m.bPass THEN DO Test2 WITH m.bPass ENDIF RETURN *------------------------------------------------------------------------------- PROCEDURE Test0( bPass ) LOCAL nDOW,nYr,nMo, bOK, nFail, ; dRef,dF0 nFail = 0 FOR nDOW = 1 TO 7 FOR nYr = 1900 TO 2100 FOR nMo = 1 TO 12 bOK = .T. * Test "brute-force" fisrt day month with given DOW dRef = DATE(m.nYr,m.nMo,1) dF0 = BF_BegDowMonth(m.nYr,m.nMo,m.nDOW) bFail = .F. IF MONTH(m.dF0)<>MONTH(m.dRef) OR YEAR(m.dF0)<>YEAR(m.dRef) THEN bFail = .T. ELSE IF DOW(m.dF0)<>m.nDOW THEN bFail = .T. ELSE IF (m.dF0 - m.dRef) >= 7 THEN bFail = .T. ENDIF ENDIF ENDIF IF m.bFail THEN nFail = m.nFail + 1 ? m.nDOW, m.nYr, m.nMo ENDIF ENDFOR ENDFOR ENDFOR ? "Test 0:", IIF(m.nFail==0,"PASS","FAIL") ENDPROC && Test0 *------------------------------------------------------------------------------- PROCEDURE Test1( bPass ) LOCAL nDOW,nYr,nMo, bOK, nFail, ; dRef,dF0 nFail = 0 FOR nDOW = 1 TO 7 FOR nYr = 1900 TO 2100 FOR nMo = 1 TO 12 bOK = .T. * Test "brute-force" fisrt day month with given DOW dRef = DATE(m.nYr,m.nMo,1) dF0 = BegDowMonth(m.nYr,m.nMo,m.nDOW) bFail = .F. IF MONTH(m.dF0)<>MONTH(m.dRef) OR YEAR(m.dF0)<>YEAR(m.dRef) THEN bFail = .T. ELSE IF DOW(m.dF0)<>m.nDOW THEN bFail = .T. ELSE IF (m.dF0 - m.dRef) >= 7 THEN bFail = .T. ENDIF ENDIF ENDIF IF m.bFail THEN nFail = m.nFail + 1 ? m.nDOW, m.nYr, m.nMo ENDIF ENDFOR ENDFOR ENDFOR ? "Test 1:", IIF(m.nFail==0,"PASS","FAIL") ENDPROC && Test1 *------------------------------------------------------------------------------- PROCEDURE Test2( bPass ) LOCAL nDOW,nYr,nMo, bOK, nFail, ; dRef,dF0 nFail = 0 FOR nDOW = 1 TO 7 FOR nYr = 1900 TO 2100 FOR nMo = 1 TO 12 bOK = .T. nC0 = BF_DowCnt(m.nYr,m.nMo,m.nDOW) nC1 = DowCnt1(m.nYr,m.nMo,m.nDOW) bFail = .F. IF m.nC0 <> m.nC1 THEN bFail = .T. ENDIF IF m.bFail THEN nFail = m.nFail + 1 ? m.nDOW, m.nYr, m.nMo, nC0,m.nC1 ENDIF ENDFOR ENDFOR ENDFOR ? "Test 2:", IIF(m.nFail==0,"PASS","FAIL") ENDPROC && Test2 *------------------------------------------------------------------------------- FUNCTION BF_BegDowMonth(nYr,nMo,nDOW) * A "brute-forcce" method of getting first day of a month that has a gven * day of week. LOCAL dDt,dRet,I dRet = {} dDt = DATE(m.nYr,m.nMo,1) FOR I=1 TO 8 IF DOW(m.dDt)==m.nDOW THEN dRet = m.dDt EXIT ENDIF dDt = m.dDt + 1 ENDFOR RETURN m.dRet ENDFUNC && BF_BegDowMonth *------------------------------------------------------------------------------- FUNCTION BF_DowCnt(nYr,nMo,nDOW) * "Brute-force" method of counting days in a month that match a given * day of week. LOCAL dDt,nCnt nCnt = 0 dDt = DATE(m.nYr,m.nMo,1) DO WHILE MONTH(m.dDt)==m.nMo AND YEAR(m.dDt)==m.nYr IF DOW(m.dDt)==m.nDOW THEN nCnt = m.nCnt + 1 ENDIF dDt = m.dDt + 1 ENDDO RETURN m.nCnt ENDFUNC && BF_DowCnt *------------------------------------------------------------------------------- FUNCTION DowCnt1(nYr,nMo,nDOW) * A slightly more involved method (which should be a tad faster than the * "brute force" method of counting days in a month that match a given * day of week. LOCAL d0,d1, dN d0 = BegDoWMonth(m.nYr,m.nMo,m.nDOW) dN = GOMONTH(DATE(m.nYr,m.nMo,1),1) d1 = BegDoWMonth(YEAR(m.dN),MONTH(m.dN),m.nDOW) RETURN INT( ( m.d1 - m.d0 ) / 7) ENDFUNC && DowCnt1 *------------------------------------------------------------------------------- FUNCTION BegDowMonth(nYr,nMo,nDOW) * A slightly more involved method of getting the first day of a month that * has a gven day of week. LOCAL dDt,dRet dDt = DATE(m.nYr,m.nMo,1) dRet = m.dDt - DOW(m.dDt) + m.nDOW IF MONTH(m.dRet) <> m.nMo THEN dRet = m.dRet + 7 ENDIF RETURN m.dRet ENDFUNC && BegDowMonth