Commit eafddd9b by Gabriel Falcao

fixing inline comments support. closes #301 Thanks @medwards 👍

parent 33981528
...@@ -47,6 +47,8 @@ class REP(object): ...@@ -47,6 +47,8 @@ class REP(object):
only_whitespace = re.compile('^\s*$') only_whitespace = re.compile('^\s*$')
tag_extraction_regex = re.compile(r'(?:(?:^|\s+)[@]([^@\s]+))') tag_extraction_regex = re.compile(r'(?:(?:^|\s+)[@]([^@\s]+))')
tag_strip_regex = re.compile(ur'(?:(?:^\s*|\s+)[@]\S+\s*)+$', re.DOTALL) tag_strip_regex = re.compile(ur'(?:(?:^\s*|\s+)[@]\S+\s*)+$', re.DOTALL)
comment_strip1 = re.compile(ur'(^[^\'"]*)[#]([^\'"]*)$')
comment_strip2 = re.compile(ur'(^[^\'"]+)[#](.*)$')
class HashList(list): class HashList(list):
...@@ -414,6 +416,12 @@ class Step(object): ...@@ -414,6 +416,12 @@ class Step(object):
self.passed = True self.passed = True
return True return True
@classmethod
def _handle_inline_comments(klass, line):
line = REP.comment_strip1.sub(r'\g<1>\g<2>', line)
line = REP.comment_strip2.sub(r'\g<1>', line)
return line
@staticmethod @staticmethod
def run_all(steps, outline=None, run_callbacks=False, ignore_case=True): def run_all(steps, outline=None, run_callbacks=False, ignore_case=True):
"""Runs each step in the given list of steps. """Runs each step in the given list of steps.
...@@ -491,6 +499,8 @@ class Step(object): ...@@ -491,6 +499,8 @@ class Step(object):
step_strings[-1] += "\n%s" % line step_strings[-1] += "\n%s" % line
elif strings.wise_startswith(line, u"|") or in_multiline: elif strings.wise_startswith(line, u"|") or in_multiline:
step_strings[-1] += "\n%s" % line step_strings[-1] += "\n%s" % line
elif '#' in line:
step_strings.append(klass._handle_inline_comments(line))
else: else:
step_strings.append(line) step_strings.append(line)
......
...@@ -14,6 +14,15 @@ ...@@ -14,6 +14,15 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from sure import expect
from lettuce.core import Step
from lettuce.core import Scenario
from lettuce.core import Feature
from lettuce.exceptions import LettuceSyntaxError
from nose.tools import assert_equals
from nose.tools import assert_raises
SCENARIO1 = """ SCENARIO1 = """
Scenario: Adding some students to my university database Scenario: Adding some students to my university database
...@@ -175,14 +184,24 @@ Scenario: Adding some students to my university database ...@@ -175,14 +184,24 @@ Scenario: Adding some students to my university database
""" """
from sure import that INLINE_COMMENTS = '''
from lettuce.core import Step Scenario: Making a sword
from lettuce.core import Scenario Given I am using an anvil
from lettuce.core import Feature And I am using a hammer # informational "comment"
from lettuce.exceptions import LettuceSyntaxError '''
INLINE_COMMENTS_IGNORED_WITHIN_DOUBLE_QUOTES = '''
Scenario: Tweeting
Given I am logged in on twitter
When I search for the hashtag "#hammer"
'''
INLINE_COMMENTS_IGNORED_WITHIN_SINGLE_QUOTES = """
Scenario: Tweeting
Given I am logged in on twitter
When I search for the hashtag '#hammer'
"""
from nose.tools import assert_equals
from nose.tools import assert_raises
def test_scenario_has_name(): def test_scenario_has_name():
"It should extract the name of the scenario" "It should extract the name of the scenario"
...@@ -427,6 +446,7 @@ def test_scenario_aggregate_all_examples_blocks(): ...@@ -427,6 +446,7 @@ def test_scenario_aggregate_all_examples_blocks():
] ]
) )
def test_commented_scenarios(): def test_commented_scenarios():
"A scenario string that contains lines starting with '#' will be commented" "A scenario string that contains lines starting with '#' will be commented"
scenario = Scenario.from_string(COMMENTED_SCENARIO) scenario = Scenario.from_string(COMMENTED_SCENARIO)
...@@ -435,26 +455,26 @@ def test_commented_scenarios(): ...@@ -435,26 +455,26 @@ def test_commented_scenarios():
def test_scenario_has_tag(): def test_scenario_has_tag():
"A scenario object should be able to find at least one tag " \ ("A scenario object should be able to find at least one tag "
"on the first line" "on the first line")
scenario = Scenario.from_string( scenario = Scenario.from_string(
SCENARIO1, SCENARIO1,
original_string=('@onetag\n' + SCENARIO1.strip())) original_string=('@onetag\n' + SCENARIO1.strip()))
assert that(scenario.tags).deep_equals(['onetag']) expect(scenario.tags).to.equal(['onetag'])
def test_scenario_has_tags_singleline(): def test_scenario_has_tags_singleline():
"A scenario object should be able to find many tags " \ ("A scenario object should be able to find many tags "
"on the first line" "on the first line")
scenario = Scenario.from_string( scenario = Scenario.from_string(
SCENARIO1, SCENARIO1,
original_string=( original_string=(
'@onetag @another @$%^&even-weird_chars \n' + SCENARIO1.strip())) '@onetag @another @$%^&even-weird_chars \n' + SCENARIO1.strip()))
assert that(scenario.tags).deep_equals([ expect(scenario.tags).to.equal([
'onetag', 'onetag',
'another', 'another',
'$%^&even-weird_chars', '$%^&even-weird_chars',
...@@ -469,7 +489,7 @@ def test_scenario_matches_tags(): ...@@ -469,7 +489,7 @@ def test_scenario_matches_tags():
SCENARIO1, SCENARIO1,
original_string=('@onetag\n@another-one\n' + SCENARIO1.strip())) original_string=('@onetag\n@another-one\n' + SCENARIO1.strip()))
assert that(scenario.tags).deep_equals(['onetag','another-one']) expect(scenario.tags).to.equal(['onetag', 'another-one'])
assert scenario.matches_tags(['onetag']) assert scenario.matches_tags(['onetag'])
assert scenario.matches_tags(['another-one']) assert scenario.matches_tags(['another-one'])
...@@ -526,6 +546,43 @@ def test_scenario_show_tags_in_its_representation(): ...@@ -526,6 +546,43 @@ def test_scenario_show_tags_in_its_representation():
SCENARIO1, SCENARIO1,
original_string=('@slow\n@firefox\n@chrome\n' + SCENARIO1.strip())) original_string=('@slow\n@firefox\n@chrome\n' + SCENARIO1.strip()))
assert that(scenario.represented()).equals( expect(scenario.represented()).to.equal(
u' @slow @firefox @chrome\n ' u' @slow @firefox @chrome\n '
'Scenario: Adding some students to my university database') 'Scenario: Adding some students to my university database')
def test_scenario_with_inline_comments():
("Scenarios can have steps with inline comments")
scenario = Scenario.from_string(INLINE_COMMENTS)
step1, step2 = scenario.steps
expect(step1.sentence).to.equal(u'Given I am using an anvil')
expect(step2.sentence).to.equal(u'And I am using a hammer')
def test_scenario_with_hash_within_double_quotes():
("Scenarios have hashes within double quotes and yet don't "
"consider them as comments")
scenario = Scenario.from_string(
INLINE_COMMENTS_IGNORED_WITHIN_DOUBLE_QUOTES)
step1, step2 = scenario.steps
expect(step1.sentence).to.equal(u'Given I am logged in on twitter')
expect(step2.sentence).to.equal(u'When I search for the hashtag "#hammer"')
def test_scenario_with_hash_within_single_quotes():
("Scenarios have hashes within single quotes and yet don't "
"consider them as comments")
scenario = Scenario.from_string(
INLINE_COMMENTS_IGNORED_WITHIN_SINGLE_QUOTES)
step1, step2 = scenario.steps
expect(step1.sentence).to.equal(u'Given I am logged in on twitter')
expect(step2.sentence).to.equal(u"When I search for the hashtag '#hammer'")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment