[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/toroidal-code/cppspec/main/spec/lifecycle_spec.cpp [Back]  [Original]

#include 

#include "cppspec.hpp"

using namespace CppSpec;

namespace {
int before_each_calls = 0;
int after_each_state  = 0;
int before_all_init   = 0;
int after_all_x       = 0;
int hook_n            = 0;
int stacked_total     = 0;
}  // namespace

// before_each runs once per it, not once per describe
describe before_each_ordering_spec("before_each ordering", $ {
  before_each([] { before_each_calls++; });

  it("first it: calls == 1", _ {
    expect(before_each_calls).to_equal(1);
  });

  it("second it: calls == 2 (incremented again)", _ {
    expect(before_each_calls).to_equal(2);
  });

  it("third it: calls == 3", _ {
    expect(before_each_calls).to_equal(3);
  });
});

// after_each runs after every it
describe after_each_ordering_spec("after_each ordering", $ {
  before_each([] { after_each_state = 10; });
  after_each([] { after_each_state = 0;  });

  it("sees state == 10 at start", _ {
    expect(after_each_state).to_equal(10);
    after_each_state = 99;  // mutate  after_each resets it
  });

  it("sees state == 10 again (reset by after_each)", _ {
    expect(after_each_state).to_equal(10);
  });

  it("state is always clean", _ {
    expect(after_each_state).to_equal(10);
  });
});

// before_all runs exactly once at the start of the block
describe before_all_spec("before_all runs once", $ {
  before_all([] { before_all_init = 42; });

  it("sees the before_all value", _ {
    expect(before_all_init).to_equal(42);
  });

  it("value is not reset between its", _ {
    expect(before_all_init).to_equal(42);
    before_all_init = 99;
  });

  it("now sees the modified value (before_all did NOT re-run)", _ {
    expect(before_all_init).to_equal(99);
  });
});

// after_all fires after all its in a context are done
describe after_all_timing_spec("after_all timing", $ {
  context("inner context with after_all", _ {
    after_all([] { after_all_x = 777; });

    it("runs while x is still 0", _ {
      expect(after_all_x).to_equal(0);
    });

    it("still 0 before after_all fires", _ {
      expect(after_all_x).to_equal(0);
    });
    // after_all fires here
  });

  it("outer it sees x == 777 after inner after_all ran", _ {
    expect(after_all_x).to_equal(777);
  });
});

// hooks propagate into nested contexts
describe hook_propagation_spec("hook propagation into nested contexts", $ {
  before_each([] { hook_n = 1; });
  after_each([] { hook_n = 0; });

  it("outer it sees n == 1", _ {
    expect(hook_n).to_equal(1);
  });

  context("nested context inherits outer hooks", _ {
    it("inner it also sees n == 1 from outer before_each", _ {
      expect(hook_n).to_equal(1);
    });

    it("inner it gets fresh n each time", _ {
      expect(hook_n).to_equal(1);
      hook_n = 99;
    });

    it("after_each reset: n is 1 again", _ {
      expect(hook_n).to_equal(1);
    });
  });

  it("outer it after nested still gets n == 1", _ {
    expect(hook_n).to_equal(1);
  });
});

// additional before_each in nested context stacks on top of parent
describe stacked_hooks_spec("stacked hooks in nested contexts", $ {
  before_each([] { stacked_total = 0; stacked_total += 1; });  // outer: reset then add 1

  context("inner adds more", _ {
    before_each([] { stacked_total += 10; });  // runs after outer: 0 + 1 + 10 = 11

    it("sees total == 11 (1 from outer + 10 from inner)", _ {
      expect(stacked_total).to_equal(11);
    });

    it("each it starts fresh: total == 11 again", _ {
      expect(stacked_total).to_equal(11);
    });
  });

  it("outer it only gets outer before_each: total == 1", _ {
    expect(stacked_total).to_equal(1);
  });
});

CPPSPEC_MAIN(before_each_ordering_spec, after_each_ordering_spec, before_all_spec,
             after_all_timing_spec, hook_propagation_spec, stacked_hooks_spec);

Web Proxy Viewer  |  New URL  |  Original Page