From 720e1540b1d9cebbe5bfe91e9f5b921d48c4bf0c Mon Sep 17 00:00:00 2001 From: Taka Date: Sat, 10 Oct 2020 08:54:47 +0000 Subject: [PATCH] Tightened up the VASSAL tests. --- vasl_templates/webapp/static/vassal.js | 1 + vasl_templates/webapp/tests/test_vassal.py | 8 ++----- vasl_templates/webapp/vassal.py | 12 ++++++++-- vassal-shim/release/vassal-shim.jar | Bin 34619 -> 34853 bytes vassal-shim/src/vassal_shim/VassalShim.java | 24 ++++++++++++++++---- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/vasl_templates/webapp/static/vassal.js b/vasl_templates/webapp/static/vassal.js index 61878ba..c0f2d9f 100644 --- a/vasl_templates/webapp/static/vassal.js +++ b/vasl_templates/webapp/static/vassal.js @@ -26,6 +26,7 @@ function _do_update_vsav( vsav_data, fname ) filename: fname, vsav_data: vsav_data, players: [ get_player_nat(1), get_player_nat(2) ], + testMode: !! getUrlParam( "store_msgs" ), snippets: snippets } ; $.ajax( { diff --git a/vasl_templates/webapp/tests/test_vassal.py b/vasl_templates/webapp/tests/test_vassal.py index 63b1aad..05909e7 100644 --- a/vasl_templates/webapp/tests/test_vassal.py +++ b/vasl_templates/webapp/tests/test_vassal.py @@ -354,9 +354,7 @@ def test_dump_vsav( webapp, webdriver ): """Test dumping a scenario.""" # initialize - control_tests = init_webapp( webapp, webdriver, - reset = lambda ct: ct.set_data_dir( dtype="real" ) - ) + control_tests = init_webapp( webapp, webdriver ) def do_test(): #pylint: disable=missing-docstring @@ -686,9 +684,7 @@ def test_analyze_vsav_hip_concealed( webapp, webdriver ): """Test analyzing a scenario that contains HIP and concealed units.""" # initialize - control_tests = init_webapp( webapp, webdriver, vsav_persistence=1, scenario_persistence=1, - reset = lambda ct: ct.set_data_dir( dtype="real" ) - ) + control_tests = init_webapp( webapp, webdriver, vsav_persistence=1, scenario_persistence=1 ) def do_test(): #pylint: disable=missing-docstring diff --git a/vasl_templates/webapp/vassal.py b/vasl_templates/webapp/vassal.py index aafae72..fe1abe1 100644 --- a/vasl_templates/webapp/vassal.py +++ b/vasl_templates/webapp/vassal.py @@ -36,6 +36,7 @@ def update_vsav(): #pylint: disable=too-many-statements,too-many-locals vsav_filename = request.json[ "filename" ] players = request.json[ "players" ] snippets = request.json[ "snippets" ] + test_mode = request.json.get( "testMode" ) # initialize logger = logging.getLogger( "update_vsav" ) @@ -61,7 +62,7 @@ def update_vsav(): #pylint: disable=too-many-statements,too-many-locals with TempFile() as snippets_file: # save the snippets in a temp file - xml = _save_snippets( snippets, players, snippets_file, logger ) + xml = _save_snippets( snippets, players, snippets_file, test_mode, logger ) snippets_file.close( delete=False ) fname = app.config.get( "UPDATE_VSAV_SNIPPETS" ) # nb: for diagnosing problems if fname: @@ -115,7 +116,7 @@ def update_vsav(): #pylint: disable=too-many-statements,too-many-locals }, } ) -def _save_snippets( snippets, players, fp, logger ): #pylint: disable=too-many-locals +def _save_snippets( snippets, players, fp, test_mode, logger ): #pylint: disable=too-many-locals """Save the snippets in a file. NOTE: We save the snippets as XML because Java :-/ @@ -136,6 +137,13 @@ def _save_snippets( snippets, players, fp, logger ): #pylint: disable=too-many-l ET.SubElement( root, "player1", nat=players[0] ) ET.SubElement( root, "player2", nat=players[1] ) + # FUDGE! Some of the VASSAL tests update a scenario and check what labels were updated, but this can fail + # if we're using the real data files, and make a change to e.g. the common CSS (since it will cause labels + # to update unexpectedly). To work-around this, if we are running tests, we do tell the VASSAL shim to do + # "fuzzy" comparisons (and ignore un-important content) when deciding if a label needs to be updated. + if test_mode: + root.set( "fuzzyLabelCompares", "true" ) + # add the snippets for snippet_id,snippet_info in snippets.items(): diff --git a/vassal-shim/release/vassal-shim.jar b/vassal-shim/release/vassal-shim.jar index a0226e8d06920153451b08e4511623c9d9d3d6cd..73e29712dc73d4b6ba873a2d77fc98eac0d1084e 100644 GIT binary patch delta 18643 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 WDG(4y?vLr#I6yi@RX82@i~b8S91Y(9 delta 18507 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 diff --git a/vassal-shim/src/vassal_shim/VassalShim.java b/vassal-shim/src/vassal_shim/VassalShim.java index 8ff6e48..7742668 100644 --- a/vassal-shim/src/vassal_shim/VassalShim.java +++ b/vassal-shim/src/vassal_shim/VassalShim.java @@ -344,7 +344,8 @@ public class VassalShim // load the snippets supplied to us by the web server String[] players = new String[2] ; Map snippets = new HashMap() ; - parseSnippets( snippetsFilename, players, snippets ) ; + AppBoolean fuzzyLabelCompares = new AppBoolean( false ) ; + parseSnippets( snippetsFilename, players, snippets, fuzzyLabelCompares ) ; // load the scenario configureBoards() ; @@ -392,7 +393,7 @@ public class VassalShim } // update the labels from the snippets - Map< String, ArrayList > labelReport = processSnippets( ourLabels, otherLabels, snippets ) ; + Map< String, ArrayList > labelReport = processSnippets( ourLabels, otherLabels, snippets, fuzzyLabelCompares ) ; // save the scenario saveScenario( saveFilename ) ; @@ -406,7 +407,7 @@ public class VassalShim // any possible problems caused by reusing the current session (e.g. there might be some saved state somewhere). } - private void parseSnippets( String snippetsFilename, String[] players, Map snippets ) throws IOException, ParserConfigurationException, SAXException, XPathExpressionException + private void parseSnippets( String snippetsFilename, String[] players, Map snippets, AppBoolean fuzzyLabelCompares ) throws IOException, ParserConfigurationException, SAXException, XPathExpressionException { logger.info( "Loading snippets: {}", snippetsFilename ) ; @@ -415,6 +416,9 @@ public class VassalShim DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder() ; Document doc = docBuilder.parse( new File( snippetsFilename ) ) ; doc.getDocumentElement().normalize() ; + fuzzyLabelCompares.setVal( + doc.getDocumentElement().getAttribute( "fuzzyLabelCompares" ).equals( "true" ) + ) ; // get the player details NodeList nodes = doc.getElementsByTagName( "player1" ) ; @@ -537,7 +541,7 @@ public class VassalShim } private Map< String, ArrayList > - processSnippets( Map ourLabels, ArrayList otherLabels, Map snippets ) + processSnippets( Map ourLabels, ArrayList otherLabels, Map snippets, AppBoolean fuzzyLabelCompares ) { // initialize Map< String, ArrayList > labelReport = new HashMap>() ; @@ -574,9 +578,11 @@ public class VassalShim } // we've match the snippet to a label, update the label content String currState = labelFields.gamePiece().getState() ; + String currStateCmp = fuzzyLabelCompares.getVal() ? adjustLabelContent( currState ) : currState ; String snippetContent = snippet.content.replace( "\n", " " ) ; String newState = labelFields.getNewGamePieceState( snippetContent ) ; - if ( currState.equals( newState ) ) { + String newStateCmp = fuzzyLabelCompares.getVal() ? adjustLabelContent( newState ) : newState ; + if ( currStateCmp.equals( newStateCmp ) ) { logger.info( "- Skipping label (unchanged): {}", snippetId ) ; labelReport.get( "unchanged" ).add( new ReportNode( snippetId, null ) ) ; } else { @@ -921,6 +927,14 @@ public class VassalShim Utils.saveXml( doc, reportFilename ) ; } + private String adjustLabelContent( String val ) + { + // remove content we want to ignore when comparing labels + Pattern pattern = Pattern.compile( "" ) ; + val = pattern.matcher( val ).replaceAll( "{{{STYLE}}}" ) ; + return val ; + } + public void takeScreenshot( String scenarioFilename, String outputFilename ) throws IOException, InterruptedException {