xyc
2 天以前 7032f3fb2ff26256e776e04a9bc62c8fab14379a
traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java
@@ -21,12 +21,18 @@
    void formatsTableRatiosAsSignedPercentages() throws Exception {
        HolidayBulletinService service = new HolidayBulletinService(null);
        assertEquals("-4.7%", ratio(service, "95.3", "100"));
        assertEquals("1.0%", ratio(service, "101", "100"));
        assertEquals("0%", ratio(service, "100", "100"));
        assertEquals("0%", ratio(service, "10004", "10000"));
        assertEquals("—", ratio(service, "100", null));
        assertEquals("—", ratio(service, "100", "0"));
        assertEquals("-4.7%", ratio(service, "95.3", "100", 1));
        assertEquals("-4.4%", ratio(service, "95.551398", "100", 1));
        assertEquals("-4.5%", ratio(service, "95.551398", "100", 2));
        assertEquals("-0.1%", ratio(service, "99.955", "100", 2));
        assertEquals("0%", ratio(service, "99.955", "100", 1));
        assertEquals("6.7%", ratio(service, "106.649", "100", 2));
        assertEquals("6.6%", ratio(service, "106.649", "100", 1));
        assertEquals("1.0%", ratio(service, "101", "100", 1));
        assertEquals("0%", ratio(service, "100", "100", 1));
        assertEquals("0%", ratio(service, "10004", "10000", 1));
        assertEquals("—", ratio(service, "100", null, 1));
        assertEquals("—", ratio(service, "100", "0", 1));
    }
    @Test
@@ -77,6 +83,43 @@
        verify(stat, never()).cumulativeMetrics(0, "NATIONAL_DAY", 1);
    }
    @Test
    void cumulativeParagraphUsesExcelDisplayThenBulletinRounding() throws Exception {
        HolidayBulletinService service = new HolidayBulletinService(null);
        DailyMetrics current = new DailyMetrics();
        current.setTotalPersonFlow(new BigDecimal("3088.62958"));
        DailyMetrics previousYear = new DailyMetrics();
        previousYear.setTotalPersonFlow(new BigDecimal("3232.42742"));
        DailyMetrics twoYearsAgo = new DailyMetrics();
        twoYearsAgo.setTotalPersonFlow(new BigDecimal("3137.80860"));
        Method method = HolidayBulletinService.class.getDeclaredMethod(
                "cumulativeParagraph", DailyMetrics.class, DailyMetrics.class, DailyMetrics.class);
        method.setAccessible(true);
        String text = (String) method.invoke(service, current, previousYear, twoYearsAgo);
        assertEquals(
                "假期以来,全省全社会跨区域人员流动量累计3088.63万人次,比2025年同期下降4.5%,比2024年同期下降1.6%。",
                text);
    }
    @Test
    void cumulativeAmountsUseExcelYiDisplayBeforeWanRounding() throws Exception {
        HolidayBulletinService service = new HolidayBulletinService(null);
        assertEquals("3961.77", cumulativeNumber(service, "3961.76472"));
        assertEquals("4189.32", cumulativeNumber(service, "4189.31472"));
        assertEquals("4486.63", cumulativeNumber(service, "4486.62652"));
    }
    private String cumulativeNumber(HolidayBulletinService service, String value) throws Exception {
        Method method = HolidayBulletinService.class.getDeclaredMethod("numberCumulative", BigDecimal.class);
        method.setAccessible(true);
        BigDecimal number = value == null ? null : new BigDecimal(value);
        return (String) method.invoke(service, number);
    }
    private Object comparableCumulative(HolidayBulletinService service, DailyMetrics current,
                                        DailyMetrics comparisonYear,
                                        Function<DailyMetrics, BigDecimal> selector) throws Exception {
@@ -86,11 +129,13 @@
        return method.invoke(service, current, comparisonYear, selector);
    }
    private String ratio(HolidayBulletinService service, String current, String base) throws Exception {
        Method method = HolidayBulletinService.class.getDeclaredMethod("ratio", BigDecimal.class, BigDecimal.class);
    private String ratio(HolidayBulletinService service, String current, String base,
                         int excelPercentScale) throws Exception {
        Method method = HolidayBulletinService.class.getDeclaredMethod(
                "ratio", BigDecimal.class, BigDecimal.class, int.class);
        method.setAccessible(true);
        BigDecimal currentValue = current == null ? null : new BigDecimal(current);
        BigDecimal baseValue = base == null ? null : new BigDecimal(base);
        return (String) method.invoke(service, currentValue, baseValue);
        return (String) method.invoke(service, currentValue, baseValue, excelPercentScale);
    }
}