@Test
public void toUpperCaseWithUnderscores() {

    assertNull(StringUtil.toUpperCaseWithUnderscores(null));
    assertEquals("", StringUtil.toUpperCaseWithUnderscores(""));
    assertEquals("A", StringUtil.toUpperCaseWithUnderscores("A"));
    assertEquals("A", StringUtil.toUpperCaseWithUnderscores("a"));
    assertEquals("AB", StringUtil.toUpperCaseWithUnderscores("AB"));
    assertEquals("AB", StringUtil.toUpperCaseWithUnderscores("Ab"));
    assertEquals("A_B", StringUtil.toUpperCaseWithUnderscores("aB"));
    assertEquals("AB", StringUtil.toUpperCaseWithUnderscores("ab"));
    assertEquals("A_B", StringUtil.toUpperCaseWithUnderscores("A_B"));
    assertEquals("A_B", StringUtil.toUpperCaseWithUnderscores("A_b"));
    assertEquals("A_B", StringUtil.toUpperCaseWithUnderscores("a_B"));
    assertEquals("A_B", StringUtil.toUpperCaseWithUnderscores("a_b"));
    assertEquals("A_BC", StringUtil.toUpperCaseWithUnderscores("aBc"));
    assertEquals("A_BC_DEF", StringUtil.toUpperCaseWithUnderscores("  aBc def "));
    assertEquals("A_BC_DEF", StringUtil.toUpperCaseWithUnderscores("aBcDef"));
    assertEquals("A_BC_DEF_GHI", StringUtil.toUpperCaseWithUnderscores("aBc def_ghi"));
    assertEquals("A_BC_DEF_GHI", StringUtil.toUpperCaseWithUnderscores("aBcDefGhi"));
    assertEquals("A_BC_DEF_GHI_123", StringUtil.toUpperCaseWithUnderscores("aBc def_ghi 123"));
    assertEquals("A_BC_DEF_GHI_123", StringUtil.toUpperCaseWithUnderscores("aBcDefGhi123"));
    assertEquals("A_BC_DEF_GHI_123", StringUtil.toUpperCaseWithUnderscores("aBcDEFGhi123"));
    assertEquals("123_A_BC_DEF_GHI", StringUtil.toUpperCaseWithUnderscores("123aBcDEFGhi")); // 数字开始
    // 保留下划线
    assertEquals("__AB__", StringUtil.toUpperCaseWithUnderscores("__AB__"));
    assertEquals("__AB__", StringUtil.toUpperCaseWithUnderscores("__Ab__"));
    assertEquals("__A_B__", StringUtil.toUpperCaseWithUnderscores("__aB__"));
    assertEquals("__AB__", StringUtil.toUpperCaseWithUnderscores("__ab__"));
    assertEquals("__A__B__", StringUtil.toUpperCaseWithUnderscores("__A__B__"));
    assertEquals("__A__B__", StringUtil.toUpperCaseWithUnderscores("__A__b__"));
    assertEquals("__A__B__", StringUtil.toUpperCaseWithUnderscores("__a__B__"));
    assertEquals("__A__B__", StringUtil.toUpperCaseWithUnderscores("__a__b__"));
    // 保留所有的分隔符
    assertEquals("..AB..", StringUtil.toUpperCaseWithUnderscores("..AB.."));
    assertEquals("..AB..", StringUtil.toUpperCaseWithUnderscores("..Ab.."));
    assertEquals("..A_B..", StringUtil.toUpperCaseWithUnderscores("..aB.."));
    assertEquals("..AB..", StringUtil.toUpperCaseWithUnderscores("..ab.."));
    assertEquals("..A..B..", StringUtil.toUpperCaseWithUnderscores("..A..B.."));
    assertEquals("..A..B..", StringUtil.toUpperCaseWithUnderscores("..A..b.."));
    assertEquals("..A..B..", StringUtil.toUpperCaseWithUnderscores("..a..B.."));
    assertEquals("..A..B..", StringUtil.toUpperCaseWithUnderscores("..a..b.."));
    assertEquals("..A..123_B..", StringUtil.toUpperCaseWithUnderscores("..A..123B.."));
    assertEquals("..A..123_B..", StringUtil.toUpperCaseWithUnderscores("..A..123b.."));
    assertEquals("..A..123_B..", StringUtil.toUpperCaseWithUnderscores("..a..123B.."));
    assertEquals("..A..123_B..", StringUtil.toUpperCaseWithUnderscores("..a..123b.."));
    assertEquals("_FMH.M._0.N", StringUtil.toUpperCaseWithUnderscores("_fmh.m._0.n"));
    assertEquals("AAA-BBB-CCC", StringUtil.toUpperCaseWithUnderscores("aaa-bbb-ccc"));
}