10ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustpackage org.testng.internal; 20ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust 30ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlClass; 4e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beustimport org.testng.xml.XmlInclude; 58ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beustimport org.testng.xml.XmlPackage; 60ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlSuite; 70ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlTest; 8f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beustimport org.yaml.snakeyaml.TypeDescription; 9f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beustimport org.yaml.snakeyaml.constructor.Constructor; 109ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.Node; 119ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.NodeId; 129ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.ScalarNode; 13c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust 140ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.File; 150ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.FileInputStream; 160ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.FileNotFoundException; 17f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beustimport java.io.InputStream; 180ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.util.List; 190ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.util.Map; 200ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust 218ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust/** 228ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust * YAML support for TestNG. 233b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt * 241bc72f147bc68596499591920997af8a9bfdde1dCédric Beust * @author Cedric Beust <cedric@beust.com> 258ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust */ 260ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustpublic class Yaml { 270ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust 28f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust public static XmlSuite parse(String filePath, InputStream is) 29f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust throws FileNotFoundException { 309ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr Constructor constructor = new TestNGConstructor(XmlSuite.class); 31e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust { 32e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust TypeDescription suiteDescription = new TypeDescription(XmlSuite.class); 33e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust suiteDescription.putListPropertyType("packages", XmlPackage.class); 34e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust suiteDescription.putListPropertyType("listeners", String.class); 35e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust suiteDescription.putListPropertyType("tests", XmlTest.class); 36e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust suiteDescription.putListPropertyType("method-selectors", XmlMethodSelector.class); 37e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust constructor.addTypeDescription(suiteDescription); 38e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 39e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 40e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust { 41e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust TypeDescription testDescription = new TypeDescription(XmlTest.class); 42e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust testDescription.putListPropertyType("classes", XmlClass.class); 43e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust testDescription.putMapPropertyType("metaGroups", String.class, List.class); 44c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust testDescription.putListPropertyType("method-selectors", XmlMethodSelector.class); 45e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust constructor.addTypeDescription(testDescription); 46e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 47e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 483b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt org.yaml.snakeyaml.Yaml y = new org.yaml.snakeyaml.Yaml(constructor); 49f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust if (is == null) is = new FileInputStream(new File(filePath)); 50f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust XmlSuite result = (XmlSuite) y.load(is); 513aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust 523aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust result.setFileName(filePath); 53fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust // DEBUG 54fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust// System.out.println("[Yaml] " + result.toXml()); 55f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust 56c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust // Adjust XmlTest parents and indices 57f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust for (XmlTest t : result.getTests()) { 58f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust t.setSuite(result); 59c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust int index = 0; 60c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust for (XmlClass c : t.getClasses()) { 61c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust c.setIndex(index++); 62c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust } 63f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust } 648f6faaf3679423dd0bec9f412f38e520c9ee2519Cédric Beust 65f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust return result; 660ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust } 670ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust 683dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust private static void maybeAdd(StringBuilder sb, String key, Object value, Object def) { 693dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(sb, "", key, value, def); 70e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 71e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 723dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust private static void maybeAdd(StringBuilder sb, String sp, String key, Object value, Object def) { 733dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust if (value != null && ! value.equals(def)) { 743dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust sb.append(sp).append(key).append(": ").append(value.toString()).append("\n"); 753dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust } 76e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 77e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 78a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust /** 79a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust * The main entry point to convert an XmlSuite into YAML. This method is allowed to be used 80a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust * by external tools (e.g. Eclipse). 81a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust */ 82e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust public static StringBuilder toYaml(XmlSuite suite) { 83e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust StringBuilder result = new StringBuilder(); 84e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 853dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "name", suite.getName(), null); 863dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "junit", suite.isJUnit(), XmlSuite.DEFAULT_JUNIT); 873dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "verbose", suite.getVerbose(), XmlSuite.DEFAULT_VERBOSE); 883dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "threadCount", suite.getThreadCount(), XmlSuite.DEFAULT_THREAD_COUNT); 89e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust maybeAdd(result, "dataProviderThreadCount", suite.getDataProviderThreadCount(), 903aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust XmlSuite.DEFAULT_DATA_PROVIDER_THREAD_COUNT); 913dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "timeOut", suite.getTimeOut(), null); 9224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr maybeAdd(result, "parallel", suite.getParallel(), XmlSuite.DEFAULT_PARALLEL); 933dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust maybeAdd(result, "skipFailedInvocationCounts", suite.skipFailedInvocationCounts(), 943dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust XmlSuite.DEFAULT_SKIP_FAILED_INVOCATION_COUNTS); 95e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 96fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust toYaml(result, "parameters", "", suite.getParameters()); 973aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust toYaml(result, suite.getPackages()); 983aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust 993aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust if (suite.getListeners().size() > 0) { 1003aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust result.append("listeners:\n"); 1013aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust toYaml(result, " ", suite.getListeners()); 1021ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust } 1033aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust 104cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust if (suite.getPackages().size() > 0) { 105cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust result.append("packages:\n"); 106cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust toYaml(result, suite.getPackages()); 107cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust } 108e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust if (suite.getTests().size() > 0) { 1098a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust result.append("tests:\n"); 110e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust for (XmlTest t : suite.getTests()) { 1118a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust toYaml(result, " ", t); 112e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 113e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 114e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust 115e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust if (suite.getChildSuites().size() > 0) { 116e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust result.append("suite-files:\n"); 117e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust toYaml(result, " ", suite.getSuiteFiles()); 118e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust } 119e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust 120e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust return result; 121e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 122e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 123e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void toYaml(StringBuilder result, String sp, XmlTest t) { 124e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust String sp2 = sp + " "; 1251ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust result.append(sp).append("- name: ").append(t.getName()).append("\n"); 1263dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust 1274b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust maybeAdd(result, sp2, "junit", t.isJUnit(), XmlSuite.DEFAULT_JUNIT); 1284b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust maybeAdd(result, sp2, "verbose", t.getVerbose(), XmlSuite.DEFAULT_VERBOSE); 1294b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust maybeAdd(result, sp2, "timeOut", t.getTimeOut(), null); 13024ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr maybeAdd(result, sp2, "parallel", t.getParallel(), XmlSuite.DEFAULT_PARALLEL); 1314b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust maybeAdd(result, sp2, "skipFailedInvocationCounts", t.skipFailedInvocationCounts(), 1323dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust XmlSuite.DEFAULT_SKIP_FAILED_INVOCATION_COUNTS); 1333dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust 13424215389671eeb04764ee673748987ef2c0fb367Cédric Beust maybeAdd(result, "preserveOrder", sp2, t.getPreserveOrder(), XmlSuite.DEFAULT_PRESERVE_ORDER); 135e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 136fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust toYaml(result, "parameters", sp2, t.getTestParameters()); 137fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust 138fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust if (t.getIncludedGroups().size() > 0) { 139fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust result.append(sp2).append("includedGroups: [ ") 140fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust .append(Utils.join(t.getIncludedGroups(), ",")) 141fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust .append(" ]\n"); 142fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust } 143fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust 144fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust if (t.getExcludedGroups().size() > 0) { 145fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust result.append(sp2).append("excludedGroups: [ ") 146fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust .append(Utils.join(t.getExcludedGroups(), ",")) 147fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust .append(" ]\n"); 148fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust } 149fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust 1508a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust Map<String, List<String>> mg = t.getMetaGroups(); 1518a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust if (mg.size() > 0) { 1528a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust result.append(sp2).append("metaGroups: { "); 1538a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust boolean first = true; 1546e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada for (Map.Entry<String, List<String>> entry : mg.entrySet()) { 1558a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust if (! first) result.append(", "); 1566e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada result.append(entry.getKey()).append(": [ ") 1576e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada .append(Utils.join(entry.getValue(), ",")).append(" ] "); 1588a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust first = false; 159e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 1608a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust result.append(" }\n"); 161e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 162e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 163e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust if (t.getXmlPackages().size() > 0) { 164e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust result.append(sp2).append("xmlPackages:\n"); 165e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust for (XmlPackage xp : t.getXmlPackages()) { 166e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust toYaml(result, sp2 + " - ", xp); 167e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust } 168e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust } 1693b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt 170e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust if (t.getXmlClasses().size() > 0) { 171e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust result.append(sp2).append("classes:\n"); 172e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust for (XmlClass xc : t.getXmlClasses()) { 173e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust toYaml(result, sp2 + " ", xc); 174e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust } 175e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust } 176e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust 177e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust 1783dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust result.append("\n"); 179e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 180e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 181e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void toYaml(StringBuilder result, String sp2, XmlClass xc) { 182e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust List<XmlInclude> im = xc.getIncludedMethods(); 183e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust List<String> em = xc.getExcludedMethods(); 184e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust String name = im.size() > 0 || em.size() > 0 ? "name: " : ""; 185e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust 186e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust result.append(sp2).append("- " + name).append(xc.getName()).append("\n"); 187e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust if (im.size() > 0) { 188e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust result.append(sp2 + " includedMethods:\n"); 189e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust for (XmlInclude xi : im) { 190e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust toYaml(result, sp2 + " ", xi); 191e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 192e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 193e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 194e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust if (em.size() > 0) { 1951ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust result.append(sp2 + " excludedMethods:\n"); 196e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust toYaml(result, sp2 + " ", em); 197e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 198e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 199e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 200e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void toYaml(StringBuilder result, String sp2, XmlInclude xi) { 2011ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust result.append(sp2 + "- " + xi.getName()).append("\n"); 202e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 203e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 2041ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust private static void toYaml(StringBuilder result, String sp, List<String> strings) { 2051ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust for (String l : strings) { 2061ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust result.append(sp).append("- ").append(l).append("\n"); 207e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 208e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 209e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 210e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static final String SP = " "; 211e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 212e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void toYaml(StringBuilder sb, List<XmlPackage> packages) { 2133aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust if (packages.size() > 0) { 2143aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust sb.append("packages:\n"); 2153aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust for (XmlPackage p : packages) { 2163aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust toYaml(sb, " ", p); 2173aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust } 218e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 2196c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust for (XmlPackage p : packages) { 2206c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust toYaml(sb, " ", p); 2216c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust } 222e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 223e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 224e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void toYaml(StringBuilder sb, String sp, XmlPackage p) { 2251ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust sb.append(sp).append("name: ").append(p.getName()).append("\n"); 226e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 227e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust generateIncludeExclude(sb, sp, "includes", p.getInclude()); 228e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust generateIncludeExclude(sb, sp, "excludes", p.getExclude()); 229e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 230e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 231e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust private static void generateIncludeExclude(StringBuilder sb, String sp, 232e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust String key, List<String> includes) { 233e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust if (includes.size() > 0) { 234e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust sb.append(sp).append(" ").append(key).append("\n"); 235e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust for (String inc : includes) { 236e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust sb.append(sp).append(" ").append(inc); 237e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 238e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 239e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 240e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust 241fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust private static void mapToYaml(Map<String, String> map, StringBuilder out) { 242fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust if (map.size() > 0) { 243fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust out.append("{ "); 244fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust boolean first = true; 245fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust for (Map.Entry<String, String> e : map.entrySet()) { 246fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust if (! first) out.append(", "); 247fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust first = false; 248fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust out.append(e.getKey() + ": " + e.getValue()); 249fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust } 250fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust out.append(" }\n"); 251fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust } 252fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust } 253fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust 254fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust private static void toYaml(StringBuilder sb, String key, String sp, 255fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust Map<String, String> parameters) { 256fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust if (parameters.size() > 0) { 257fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust sb.append(sp).append(key).append(": "); 258fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust mapToYaml(parameters, sb); 259e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 260e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust } 2611ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust 2629ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr private static class TestNGConstructor extends Constructor { 2639ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr public TestNGConstructor(Class<? extends Object> theRoot) { 2649ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr super(theRoot); 2659ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr yamlClassConstructors.put(NodeId.scalar, new ConstructParallelMode()); 2669ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr } 2679ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr 2689ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr private class ConstructParallelMode extends ConstructScalar { 2699ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr public Object construct(Node node) { 2709ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr if (node.getType().equals(XmlSuite.ParallelMode.class)) { 2719ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr String parallel = (String) constructScalar((ScalarNode) node); 27224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr return XmlSuite.ParallelMode.getValidParallel(parallel); 2739ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr } 2749ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr return super.construct(node); 2759ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr } 2769ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr } 2771ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust } 2780ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust} 279