@@ -264,6 +264,8 @@ class TestPreprocessor : public TestFixture {
264264        TEST_CASE (testMissingIncludeCheckConfig);
265265
266266        TEST_CASE (limitsDefines);
267+ 
268+         TEST_CASE (hashCalculation);
267269    }
268270
269271    std::string getConfigsStr (const  char  filedata[], const  char  *arg = nullptr ) {
@@ -284,6 +286,16 @@ class TestPreprocessor : public TestFixture {
284286        return  ret;
285287    }
286288
289+     std::size_t  getHash (const  char  filedata[]) {
290+         Settings settings;
291+         Preprocessor preprocessor (settings, *this );
292+         std::vector<std::string> files;
293+         std::istringstream istr (filedata);
294+         simplecpp::TokenList tokens (istr,files);
295+         tokens.removeComments ();
296+         return  preprocessor.calculateHash (tokens, " " 
297+     }
298+ 
287299    void  Bug2190219 () {
288300        const  char  filedata[] = " #ifdef __cplusplus\n " 
289301                                " cpp\n " 
@@ -2510,6 +2522,20 @@ class TestPreprocessor : public TestFixture {
25102522                      " if ( l > $2147483647 ) { }\n " 
25112523                      " }" 
25122524    }
2525+ 
2526+     void  hashCalculation () {
2527+         //  #12383
2528+         const  char  code[] = " int a;" 
2529+         const  char  code2[] = " int  a;" //  extra space
2530+         const  char  code3[] = " \n\n int a;" //  extra new line
2531+ 
2532+         ASSERT_EQUALS (getHash (code), getHash (code));
2533+         ASSERT_EQUALS (getHash (code2), getHash (code2));
2534+         ASSERT_EQUALS (getHash (code3), getHash (code3));
2535+         ASSERT (getHash (code) != getHash (code2));
2536+         ASSERT (getHash (code) != getHash (code3));
2537+         ASSERT (getHash (code2) != getHash (code3));
2538+     }
25132539};
25142540
25152541REGISTER_TEST (TestPreprocessor)
0 commit comments