test_columns = ['order_book_id', 'quarter', 'info_date', 'operating_revenue', 'net_profit_parent_company', 'equity_parent_company'] # 声明最小测试合同。
test_rows = [('GAP', '2021q1', '2021-04-30', 100, 10, 100), ('GAP', '2021q2', '2021-08-01', 250, 25, 110), ('GAP', '2021q2', '2021-09-01', 260, 26, 111), ('GAP', '2021q4', '2022-03-31', 500, 50, 120), ('GAP', '2022q1', '2022-04-30', 120, 12, 125), ('FULL', '2021q1', '2021-04-30', 10, 1, 100), ('FULL', '2021q2', '2021-08-31', 30, 3, 110), ('FULL', '2021q3', '2021-10-31', 60, 6, 120), ('FULL', '2021q4', '2022-03-31', 100, 10, 130), ('FULL', '2022q1', '2022-04-30', 12, 2, 140)] # 同时覆盖五类边界。
quarter_test_raw = pd.DataFrame(test_rows, columns=test_columns) # 构造不依赖随机数的机制夹具。
quarter_test_raw['info_date'] = pd.to_datetime(quarter_test_raw['info_date']) # 解析测试披露日。
quarter_test_raw['report_period'] = pd.PeriodIndex(quarter_test_raw['quarter'], freq='Q') # 解析测试报告期。
quarter_test = quarter_test_raw.sort_values(['order_book_id', 'report_period', 'info_date']).drop_duplicates(['order_book_id', 'report_period'], keep='last') # 模拟主流程的最新修订选择。
quarter_test = add_single_quarter_flows(quarter_test) # 对夹具执行单季连续性守卫。
gap_q2 = quarter_test.loc[(quarter_test['order_book_id'].eq('GAP')) & (quarter_test['report_period'].eq(pd.Period('2021Q2')))].iloc[0] # 提取修订后的 Q2。
gap_q4 = quarter_test.loc[(quarter_test['order_book_id'].eq('GAP')) & (quarter_test['report_period'].eq(pd.Period('2021Q4')))].iloc[0] # 提取缺少 Q3 的 Q4。
gap_next_q1 = quarter_test.loc[(quarter_test['order_book_id'].eq('GAP')) & (quarter_test['report_period'].eq(pd.Period('2022Q1')))].iloc[0] # 提取跨年重置的 Q1。
assert gap_q2['operating_revenue'] == 260 and gap_q2['revenue_single_quarter'] == 160 # 核验重复季度保留晚披露修订并正确差分。
assert gap_q2['single_info_date'] == pd.Timestamp('2021-09-01') # 核验单季值等待两个累计输入中的较晚披露日。
assert pd.isna(gap_q4['profit_single_quarter']) and gap_q4['quarter_gap'] == 2 # 核验缺少中间季度时阻断差分。
assert gap_next_q1['profit_single_quarter'] == 12 # 核验跨年 Q1 不与上一年 Q4 作差。
test_groups = quarter_test.groupby('order_book_id', sort=False) # 为 TTM 与同比滞后建立测试分组。
quarter_test['lag_3'] = test_groups['quarter_serial'].shift(3) # 取得四条窗口起点。
quarter_test['valid_ttm'] = quarter_test['quarter_serial'].sub(quarter_test['lag_3']).eq(3) & test_groups['profit_single_quarter'].transform(lambda series: series.notna().rolling(4, min_periods=4).sum().eq(4)) # 复算 TTM 连续性合同。
quarter_test['lag_4'] = test_groups['quarter_serial'].shift(4) # 取得候选同比季度。
quarter_test['valid_year_lag'] = quarter_test['quarter_serial'].sub(quarter_test['lag_4']).eq(4) # 复算精确四季度滞后合同。
full_q4 = quarter_test.loc[(quarter_test['order_book_id'].eq('FULL')) & (quarter_test['report_period'].eq(pd.Period('2021Q4')))].iloc[0] # 提取首个完整四季度终点。
full_next_q1 = quarter_test.loc[(quarter_test['order_book_id'].eq('FULL')) & (quarter_test['report_period'].eq(pd.Period('2022Q1')))].iloc[0] # 提取精确同比终点。
assert full_q4['valid_ttm'] and not gap_q4.get('valid_ttm', False) # 核验连续四季通过而缺季窗口失败。
assert full_next_q1['valid_year_lag'] # 核验同比滞后只在序号差恰为四时通过。
pd.DataFrame({'duplicate_revision_kept': [gap_q2['operating_revenue'] == 260], 'missing_quarter_blocked': [pd.isna(gap_q4['profit_single_quarter'])], 'cross_year_q1_reset': [gap_next_q1['profit_single_quarter'] == 12], 'availability_date_safe': [gap_q2['single_info_date'] == pd.Timestamp('2021-09-01')], 'contiguous_ttm_and_lag': [bool(full_q4['valid_ttm'] and full_next_q1['valid_year_lag'])]}) # 输出五项测试结果。