@@ -13,7 +13,7 @@ use tmc_langs_framework::{
1313 command:: TmcCommand ,
1414 domain:: { ExerciseDesc , RunResult , TestDesc } ,
1515 file_util,
16- nom:: { bytes, character, combinator, sequence, IResult } ,
16+ nom:: { branch , bytes, character, combinator, error :: VerboseError , sequence, IResult } ,
1717 zip:: ZipArchive ,
1818 LanguagePlugin , TmcError ,
1919} ;
@@ -151,26 +151,44 @@ impl LanguagePlugin for RPlugin {
151151 vec ! [ PathBuf :: from( "tests" ) ]
152152 }
153153
154- fn points_parser ( i : & str ) -> IResult < & str , & str > {
155- combinator:: map (
154+ fn points_parser ( i : & str ) -> IResult < & str , & str , VerboseError < & str > > {
155+ let test_parser = sequence:: delimited (
156+ sequence:: tuple ( (
157+ bytes:: complete:: tag ( "test" ) ,
158+ character:: complete:: multispace0,
159+ character:: complete:: char ( '(' ) ,
160+ bytes:: complete:: take_until ( "," ) ,
161+ bytes:: complete:: take_until ( "\" " ) ,
162+ ) ) ,
163+ sequence:: delimited (
164+ character:: complete:: char ( '"' ) ,
165+ bytes:: complete:: is_not ( "\" " ) ,
166+ character:: complete:: char ( '"' ) ,
167+ ) ,
168+ sequence:: tuple ( (
169+ character:: complete:: multispace0,
170+ character:: complete:: char ( ')' ) ,
171+ ) ) ,
172+ ) ;
173+ let points_for_all_tests_parser = sequence:: delimited (
174+ sequence:: tuple ( (
175+ bytes:: complete:: tag ( "points_for_all_tests" ) ,
176+ character:: complete:: multispace0,
177+ character:: complete:: char ( '(' ) ,
178+ bytes:: complete:: take_until ( "\" " ) ,
179+ ) ) ,
156180 sequence:: delimited (
157- sequence:: tuple ( (
158- bytes:: complete:: tag ( "test" ) ,
159- character:: complete:: multispace0,
160- character:: complete:: char ( '(' ) ,
161- bytes:: complete:: take_until ( "," ) ,
162- bytes:: complete:: take_until ( "\" " ) ,
163- ) ) ,
164- sequence:: delimited (
165- character:: complete:: char ( '"' ) ,
166- bytes:: complete:: is_not ( "\" " ) ,
167- character:: complete:: char ( '"' ) ,
168- ) ,
169- sequence:: tuple ( (
170- character:: complete:: multispace0,
171- character:: complete:: char ( ')' ) ,
172- ) ) ,
181+ character:: complete:: char ( '"' ) ,
182+ bytes:: complete:: is_not ( "\" " ) ,
183+ character:: complete:: char ( '"' ) ,
173184 ) ,
185+ sequence:: tuple ( (
186+ character:: complete:: multispace0,
187+ character:: complete:: char ( ')' ) ,
188+ ) ) ,
189+ ) ;
190+ combinator:: map (
191+ branch:: alt ( ( test_parser, points_for_all_tests_parser) ) ,
174192 str:: trim,
175193 ) ( i)
176194 }
@@ -475,4 +493,39 @@ test("sample", c("r1.1"), {
475493"# ;
476494 assert_eq ! ( RPlugin :: points_parser( target) . unwrap( ) . 1 , "W1A.1.2" ) ;
477495 }
496+
497+ #[ test]
498+ fn parsing_regression_test ( ) {
499+ init ( ) ;
500+
501+ let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
502+ // a file like this used to cause an error before for some reason...
503+ file_to (
504+ & temp,
505+ "tests/testthat/testExercise.R" ,
506+ r#"library('testthat')
507+ "# ,
508+ ) ;
509+
510+ let _points = RPlugin :: get_available_points ( temp. path ( ) ) . unwrap ( ) ;
511+ }
512+
513+ #[ test]
514+ fn parses_points_for_all_tests ( ) {
515+ init ( ) ;
516+
517+ let temp = tempfile:: tempdir ( ) . unwrap ( ) ;
518+ file_to (
519+ & temp,
520+ "tests/testthat/testExercise.R" ,
521+ r#"
522+ something
523+ points_for_all_tests(c("r1"))
524+ etc
525+ "# ,
526+ ) ;
527+
528+ let points = RPlugin :: get_available_points ( temp. path ( ) ) . unwrap ( ) ;
529+ assert_eq ! ( points, & [ "r1" ] ) ;
530+ }
478531}
0 commit comments