aboutsummaryrefslogtreecommitdiff
path: root/unit_tests
diff options
context:
space:
mode:
Diffstat (limited to 'unit_tests')
-rw-r--r--unit_tests/embedded_tests.cpp4
-rw-r--r--unit_tests/init_and_shutdown.cpp533
-rw-r--r--unit_tests/linda_tests.cpp185
-rw-r--r--unit_tests/scripts/lane/tasking_cancelling.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_comms_criss_cross.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_communications.lua2
-rw-r--r--unit_tests/scripts/lane/tasking_send_receive_code.lua2
-rw-r--r--unit_tests/scripts/linda/multiple_keepers.lua6
-rw-r--r--unit_tests/scripts/linda/send_registered_userdata.lua2
9 files changed, 437 insertions, 301 deletions
diff --git a/unit_tests/embedded_tests.cpp b/unit_tests/embedded_tests.cpp
index 0991a4c..a0a7bb2 100644
--- a/unit_tests/embedded_tests.cpp
+++ b/unit_tests/embedded_tests.cpp
@@ -157,7 +157,7 @@ TEST_CASE("lanes.embedding.with default allocator")
157 // function with an upvalue 157 // function with an upvalue
158 std::string_view const _script{ 158 std::string_view const _script{
159 " local lanes = require 'lanes'.configure{with_timers = false}" 159 " local lanes = require 'lanes'.configure{with_timers = false}"
160 " local l = lanes.linda'gleh'" 160 " local l = lanes.linda{name = 'gleh'}"
161 " local upvalue = 'oeauaoeuoeuaoeuaoeujaoefubycfjbycfybcfjybcfjybcfjbcf'" 161 " local upvalue = 'oeauaoeuoeuaoeuaoeujaoefubycfjbycfybcfjybcfjybcfjbcf'"
162 " local upvalued = function()" 162 " local upvalued = function()"
163 " return upvalue" 163 " return upvalue"
@@ -183,7 +183,7 @@ TEST_CASE("lanes.embedding.with default allocator")
183 // try to send io.open into a linda, which fails if io base library is not loaded 183 // try to send io.open into a linda, which fails if io base library is not loaded
184 std::string_view const _script{ 184 std::string_view const _script{
185 " local lanes = require 'lanes'" 185 " local lanes = require 'lanes'"
186 " local l = lanes.linda'gleh'" 186 " local l = lanes.linda{name = 'gleh'}"
187 " l:set('yo', io.open)" 187 " l:set('yo', io.open)"
188 " return 'SUCCESS'" 188 " return 'SUCCESS'"
189 }; 189 };
diff --git a/unit_tests/init_and_shutdown.cpp b/unit_tests/init_and_shutdown.cpp
index 384af43..bd72157 100644
--- a/unit_tests/init_and_shutdown.cpp
+++ b/unit_tests/init_and_shutdown.cpp
@@ -289,6 +289,62 @@ TEST_CASE("lanes.configure.keepers_gc_threshold")
289 289
290// ################################################################################################# 290// #################################################################################################
291 291
292TEST_CASE("lanes.configure.linda_wake_period")
293{
294 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
295
296 // linda_wake_period should be a number > 0, or 'never'
297
298 SECTION("linda_wake_period = <table>")
299 {
300 L.requireFailure("require 'lanes'.configure{linda_wake_period = {}}");
301 }
302
303 // ---------------------------------------------------------------------------------------------
304
305 SECTION("linda_wake_period = <string>")
306 {
307 L.requireFailure("require 'lanes'.configure{linda_wake_period = 'gluh'}");
308 }
309
310 // ---------------------------------------------------------------------------------------------
311
312 SECTION("linda_wake_period = 'never'")
313 {
314 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 'never'}");
315 }
316
317 // ---------------------------------------------------------------------------------------------
318
319 SECTION("linda_wake_period = <negative number>")
320 {
321 L.requireFailure("require 'lanes'.configure{linda_wake_period = -0.001}");
322 }
323
324 // ---------------------------------------------------------------------------------------------
325
326 SECTION("linda_wake_period = 0")
327 {
328 L.requireFailure("require 'lanes'.configure{linda_wake_period = 0}");
329 }
330
331 // ---------------------------------------------------------------------------------------------
332
333 SECTION("linda_wake_period = 0.0001s")
334 {
335 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 0.0001}");
336 }
337
338 // ---------------------------------------------------------------------------------------------
339
340 SECTION("linda_wake_period = 1e30")
341 {
342 L.requireSuccess("require 'lanes'.configure{linda_wake_period = 1e30}");
343 }
344}
345
346// #################################################################################################
347
292TEST_CASE("lanes.configure.nb_user_keepers") 348TEST_CASE("lanes.configure.nb_user_keepers")
293{ 349{
294 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 350 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
@@ -300,35 +356,35 @@ TEST_CASE("lanes.configure.nb_user_keepers")
300 L.requireFailure("require 'lanes'.configure{nb_user_keepers = {}}"); 356 L.requireFailure("require 'lanes'.configure{nb_user_keepers = {}}");
301 } 357 }
302 358
303 // ----------------------------------------------------------------------------------------- 359 // ---------------------------------------------------------------------------------------------
304 360
305 SECTION("nb_user_keepers = <string>") 361 SECTION("nb_user_keepers = <string>")
306 { 362 {
307 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 'gluh'}"); 363 L.requireFailure("require 'lanes'.configure{nb_user_keepers = 'gluh'}");
308 } 364 }
309 365
310 // ----------------------------------------------------------------------------------------- 366 // ---------------------------------------------------------------------------------------------
311 367
312 SECTION("nb_user_keepers = -1") 368 SECTION("nb_user_keepers = -1")
313 { 369 {
314 L.requireFailure("require 'lanes'.configure{nb_user_keepers = -1}"); 370 L.requireFailure("require 'lanes'.configure{nb_user_keepers = -1}");
315 } 371 }
316 372
317 // ----------------------------------------------------------------------------------------- 373 // ---------------------------------------------------------------------------------------------
318 374
319 SECTION("nb_user_keepers = 0") 375 SECTION("nb_user_keepers = 0")
320 { 376 {
321 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 0}"); 377 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 0}");
322 } 378 }
323 379
324 // ----------------------------------------------------------------------------------------- 380 // ---------------------------------------------------------------------------------------------
325 381
326 SECTION("nb_user_keepers = 1") 382 SECTION("nb_user_keepers = 1")
327 { 383 {
328 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 1}"); 384 L.requireSuccess("require 'lanes'.configure{nb_user_keepers = 1}");
329 } 385 }
330 386
331 // ----------------------------------------------------------------------------------------- 387 // ---------------------------------------------------------------------------------------------
332 388
333 SECTION("nb_user_keepers = 100") 389 SECTION("nb_user_keepers = 100")
334 { 390 {
@@ -345,340 +401,355 @@ TEST_CASE("lanes.configure.nb_user_keepers")
345 401
346// ################################################################################################# 402// #################################################################################################
347 403
348TEST_CASE("lanes.configure.the rest") 404TEST_CASE("lanes.configure.on_state_create")
349{ 405{
350 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } }; 406 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
351 407
352 // on_state_create should be a function, either C or Lua, without upvalues 408 // on_state_create should be a function, either C or Lua, without upvalues
353 409
354 SECTION("on_state_create") 410 SECTION("on_state_create = <table>")
355 { 411 {
356 SECTION("on_state_create = <table>") 412 L.requireFailure("require 'lanes'.configure{on_state_create = {}}");
357 { 413 }
358 L.requireFailure("require 'lanes'.configure{on_state_create = {}}");
359 }
360 414
361 // ----------------------------------------------------------------------------------------- 415 // ---------------------------------------------------------------------------------------------
362 416
363 SECTION("on_state_create = <string>") 417 SECTION("on_state_create = <string>")
364 { 418 {
365 L.requireFailure("require 'lanes'.configure{on_state_create = 'gluh'}"); 419 L.requireFailure("require 'lanes'.configure{on_state_create = 'gluh'}");
366 } 420 }
367 421
368 // ----------------------------------------------------------------------------------------- 422 // ---------------------------------------------------------------------------------------------
369 423
370 SECTION("on_state_create = <number>") 424 SECTION("on_state_create = <number>")
371 { 425 {
372 L.requireFailure("require 'lanes'.configure{on_state_create = 1}"); 426 L.requireFailure("require 'lanes'.configure{on_state_create = 1}");
373 } 427 }
374 428
375 // ----------------------------------------------------------------------------------------- 429 // ---------------------------------------------------------------------------------------------
376 430
377 SECTION("on_state_create = false") 431 SECTION("on_state_create = false")
378 { 432 {
379 L.requireFailure("require 'lanes'.configure{on_state_create = false}"); 433 L.requireFailure("require 'lanes'.configure{on_state_create = false}");
380 } 434 }
381 435
382 // ----------------------------------------------------------------------------------------- 436 // ---------------------------------------------------------------------------------------------
383 437
384 SECTION("on_state_create = true") 438 SECTION("on_state_create = true")
385 { 439 {
386 L.requireFailure("require 'lanes'.configure{on_state_create = true}"); 440 L.requireFailure("require 'lanes'.configure{on_state_create = true}");
387 } 441 }
388 442
389 // ----------------------------------------------------------------------------------------- 443 // ---------------------------------------------------------------------------------------------
390 444
391 SECTION("on_state_create = <Lua function>") 445 SECTION("on_state_create = <Lua function>")
392 { 446 {
393 // on_state_create isn't called inside a Keeper state if it's a Lua function (which is good as print() doesn't exist there!) 447 // on_state_create isn't called inside a Keeper state if it's a Lua function (which is good as print() doesn't exist there!)
394 L.requireSuccess("local print = print; require 'lanes'.configure{on_state_create = function() print 'hello' end}"); 448 L.requireSuccess("local print = print; require 'lanes'.configure{on_state_create = function() print 'hello' end}");
395 } 449 }
396 450
397 // ----------------------------------------------------------------------------------------- 451 // ---------------------------------------------------------------------------------------------
398 452
399 SECTION("on_state_create = <C function>") 453 SECTION("on_state_create = <C function>")
400 { 454 {
401 // funnily enough, in Lua 5.3, print() uses global tostring(), that doesn't exist in a keeper since we didn't open libs -> "attempt to call a nil value" 455 // funnily enough, in Lua 5.3, print() uses global tostring(), that doesn't exist in a keeper since we didn't open libs -> "attempt to call a nil value"
402 // conclusion, don't use print() as a fake on_state_create() callback! 456 // conclusion, don't use print() as a fake on_state_create() callback!
403 // assert() should be fine since we pass a non-false argument to on_state_create 457 // assert() should be fine since we pass a non-false argument to on_state_create
404 L.requireSuccess("require 'lanes'.configure{on_state_create = assert}"); 458 L.requireSuccess("require 'lanes'.configure{on_state_create = assert}");
405 }
406 } 459 }
460}
461
462// #################################################################################################
463
464TEST_CASE("lanes.configure.shutdown_timeout")
465{
466 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
407 467
408 // ---------------------------------------------------------------------------------------------
409 // shutdown_timeout should be a number in [0,3600] 468 // shutdown_timeout should be a number in [0,3600]
410 469
411 SECTION("shutdown_timeout") 470 SECTION("shutdown_timeout = <table>")
412 { 471 {
413 SECTION("shutdown_timeout = <table>") 472 L.requireFailure("require 'lanes'.configure{shutdown_timeout = {}}");
414 { 473 }
415 L.requireFailure("require 'lanes'.configure{shutdown_timeout = {}}");
416 }
417 474
418 // ----------------------------------------------------------------------------------------- 475 // ---------------------------------------------------------------------------------------------
419 476
420 SECTION("shutdown_timeout = <string>") 477 SECTION("shutdown_timeout = <string>")
421 { 478 {
422 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 'gluh'}"); 479 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 'gluh'}");
423 } 480 }
424 481
425 // ----------------------------------------------------------------------------------------- 482 // ---------------------------------------------------------------------------------------------
426 483
427 SECTION("shutdown_timeout = <negative number>") 484 SECTION("shutdown_timeout = <negative number>")
428 { 485 {
429 L.requireFailure("require 'lanes'.configure{shutdown_timeout = -0.001}"); 486 L.requireFailure("require 'lanes'.configure{shutdown_timeout = -0.001}");
430 } 487 }
431 488
432 // ----------------------------------------------------------------------------------------- 489 // ---------------------------------------------------------------------------------------------
433 490
434 SECTION("shutdown_timeout = 0") 491 SECTION("shutdown_timeout = 0")
435 { 492 {
436 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 0}"); 493 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 0}");
437 } 494 }
438 495
439 // ----------------------------------------------------------------------------------------- 496 // ---------------------------------------------------------------------------------------------
440 497
441 SECTION("shutdown_timeout = 1s") 498 SECTION("shutdown_timeout = 1s")
442 { 499 {
443 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 1}"); 500 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 1}");
444 } 501 }
445 502
446 // ----------------------------------------------------------------------------------------- 503 // ---------------------------------------------------------------------------------------------
447 504
448 SECTION("shutdown_timeout = 3600s") 505 SECTION("shutdown_timeout = 3600s")
449 { 506 {
450 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 3600}"); 507 L.requireSuccess("require 'lanes'.configure{shutdown_timeout = 3600}");
451 } 508 }
452 509
453 // ----------------------------------------------------------------------------------------- 510 // ---------------------------------------------------------------------------------------------
454 511
455 SECTION("shutdown_timeout = <too long>") 512 SECTION("shutdown_timeout = <too long>")
456 { 513 {
457 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 3600.001}"); 514 L.requireFailure("require 'lanes'.configure{shutdown_timeout = 3600.001}");
458 }
459 } 515 }
516}
517
518// #################################################################################################
519
520TEST_CASE("lanes.configure.strip_functions")
521{
522 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
460 523
461 // ---------------------------------------------------------------------------------------------
462 // strip_functions should be a boolean 524 // strip_functions should be a boolean
463 525
464 SECTION("strip_functions") 526 SECTION("strip_functions = <table>")
465 { 527 {
466 SECTION("strip_functions = <table>") 528 L.requireFailure("require 'lanes'.configure{strip_functions = {}}");
467 { 529 }
468 L.requireFailure("require 'lanes'.configure{strip_functions = {}}");
469 }
470 530
471 // ----------------------------------------------------------------------------------------- 531 // ---------------------------------------------------------------------------------------------
472 532
473 SECTION("strip_functions = <string>") 533 SECTION("strip_functions = <string>")
474 { 534 {
475 L.requireFailure("require 'lanes'.configure{strip_functions = 'gluh'}"); 535 L.requireFailure("require 'lanes'.configure{strip_functions = 'gluh'}");
476 } 536 }
477 537
478 // ----------------------------------------------------------------------------------------- 538 // ---------------------------------------------------------------------------------------------
479 539
480 SECTION("strip_functions = <number>") 540 SECTION("strip_functions = <number>")
481 { 541 {
482 L.requireFailure("require 'lanes'.configure{strip_functions = 1}"); 542 L.requireFailure("require 'lanes'.configure{strip_functions = 1}");
483 } 543 }
484 544
485 // ----------------------------------------------------------------------------------------- 545 // ---------------------------------------------------------------------------------------------
486 546
487 SECTION("strip_functions = <C function>") 547 SECTION("strip_functions = <C function>")
488 { 548 {
489 L.requireFailure("require 'lanes'.configure{strip_functions = print}"); 549 L.requireFailure("require 'lanes'.configure{strip_functions = print}");
490 } 550 }
491 551
492 // ----------------------------------------------------------------------------------------- 552 // ---------------------------------------------------------------------------------------------
493 553
494 SECTION("strip_functions = false") 554 SECTION("strip_functions = false")
495 { 555 {
496 L.requireSuccess("require 'lanes'.configure{strip_functions = false}"); 556 L.requireSuccess("require 'lanes'.configure{strip_functions = false}");
497 } 557 }
498 558
499 // ----------------------------------------------------------------------------------------- 559 // ---------------------------------------------------------------------------------------------
500 560
501 SECTION("strip_functions = true") 561 SECTION("strip_functions = true")
502 { 562 {
503 L.requireSuccess("require 'lanes'.configure{strip_functions = true}"); 563 L.requireSuccess("require 'lanes'.configure{strip_functions = true}");
504 }
505 } 564 }
565}
566
567// #################################################################################################
568
569TEST_CASE("lanes.configure.track_lanes")
570{
571 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
506 572
507 // ---------------------------------------------------------------------------------------------
508 // track_lanes should be a boolean 573 // track_lanes should be a boolean
509 574
510 SECTION("track_lanes") 575 SECTION("track_lanes = <table>")
511 { 576 {
512 SECTION("track_lanes = <table>") 577 L.requireFailure("require 'lanes'.configure{track_lanes = {}}");
513 { 578 }
514 L.requireFailure("require 'lanes'.configure{track_lanes = {}}");
515 }
516 579
517 // ----------------------------------------------------------------------------------------- 580 // ---------------------------------------------------------------------------------------------
518 581
519 SECTION("track_lanes = <string>") 582 SECTION("track_lanes = <string>")
520 { 583 {
521 L.requireFailure("require 'lanes'.configure{track_lanes = 'gluh'}"); 584 L.requireFailure("require 'lanes'.configure{track_lanes = 'gluh'}");
522 } 585 }
523 586
524 // ----------------------------------------------------------------------------------------- 587 // ---------------------------------------------------------------------------------------------
525 588
526 SECTION("track_lanes = <number>") 589 SECTION("track_lanes = <number>")
527 { 590 {
528 L.requireFailure("require 'lanes'.configure{track_lanes = 1}"); 591 L.requireFailure("require 'lanes'.configure{track_lanes = 1}");
529 } 592 }
530 593
531 // ----------------------------------------------------------------------------------------- 594 // ---------------------------------------------------------------------------------------------
532 595
533 SECTION("track_lanes = <C function>") 596 SECTION("track_lanes = <C function>")
534 { 597 {
535 L.requireFailure("require 'lanes'.configure{track_lanes = print}"); 598 L.requireFailure("require 'lanes'.configure{track_lanes = print}");
536 } 599 }
537 600
538 // ----------------------------------------------------------------------------------------- 601 // ---------------------------------------------------------------------------------------------
539 602
540 SECTION("track_lanes = false") 603 SECTION("track_lanes = false")
541 { 604 {
542 L.requireSuccess("require 'lanes'.configure{track_lanes = false}"); 605 L.requireSuccess("require 'lanes'.configure{track_lanes = false}");
543 } 606 }
544 607
545 // ----------------------------------------------------------------------------------------- 608 // ---------------------------------------------------------------------------------------------
546 609
547 SECTION("track_lanes = true") 610 SECTION("track_lanes = true")
548 { 611 {
549 L.requireSuccess("require 'lanes'.configure{track_lanes = true}"); 612 L.requireSuccess("require 'lanes'.configure{track_lanes = true}");
550 }
551 } 613 }
614}
615
616// #################################################################################################
617
618TEST_CASE("lanes.configure.verbose_errors")
619{
620 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
552 621
553 // ---------------------------------------------------------------------------------------------
554 // verbose_errors should be a boolean 622 // verbose_errors should be a boolean
555 623
556 SECTION("verbose_errors") 624 SECTION("verbose_errors = <table>")
557 { 625 {
558 SECTION("verbose_errors = <table>") 626 L.requireFailure("require 'lanes'.configure{verbose_errors = {}}");
559 { 627 }
560 L.requireFailure("require 'lanes'.configure{verbose_errors = {}}");
561 }
562 628
563 // ----------------------------------------------------------------------------------------- 629 // ---------------------------------------------------------------------------------------------
564 630
565 SECTION("verbose_errors = <string>") 631 SECTION("verbose_errors = <string>")
566 { 632 {
567 L.requireFailure("require 'lanes'.configure{verbose_errors = 'gluh'}"); 633 L.requireFailure("require 'lanes'.configure{verbose_errors = 'gluh'}");
568 } 634 }
569 635
570 // ----------------------------------------------------------------------------------------- 636 // ---------------------------------------------------------------------------------------------
571 637
572 SECTION("verbose_errors = <number>") 638 SECTION("verbose_errors = <number>")
573 { 639 {
574 L.requireFailure("require 'lanes'.configure{verbose_errors = 1}"); 640 L.requireFailure("require 'lanes'.configure{verbose_errors = 1}");
575 } 641 }
576 642
577 // ----------------------------------------------------------------------------------------- 643 // ---------------------------------------------------------------------------------------------
578 644
579 SECTION("verbose_errors = <C function>") 645 SECTION("verbose_errors = <C function>")
580 { 646 {
581 L.requireFailure("require 'lanes'.configure{verbose_errors = print}"); 647 L.requireFailure("require 'lanes'.configure{verbose_errors = print}");
582 } 648 }
583 649
584 // ----------------------------------------------------------------------------------------- 650 // ---------------------------------------------------------------------------------------------
585 651
586 SECTION("verbose_errors = false") 652 SECTION("verbose_errors = false")
587 { 653 {
588 L.requireSuccess("require 'lanes'.configure{verbose_errors = false}"); 654 L.requireSuccess("require 'lanes'.configure{verbose_errors = false}");
589 } 655 }
590 656
591 // ----------------------------------------------------------------------------------------- 657 // ---------------------------------------------------------------------------------------------
592 658
593 SECTION("verbose_errors = true") 659 SECTION("verbose_errors = true")
594 { 660 {
595 L.requireSuccess("require 'lanes'.configure{verbose_errors = true}"); 661 L.requireSuccess("require 'lanes'.configure{verbose_errors = true}");
596 }
597 } 662 }
663}
664
665// #################################################################################################
666
667TEST_CASE("lanes.configure.with_timers")
668{
669 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
598 670
599 // ---------------------------------------------------------------------------------------------
600 // with_timers should be a boolean 671 // with_timers should be a boolean
601 672
602 SECTION("with_timers") 673 SECTION("with_timers = <table>")
603 { 674 {
604 SECTION("with_timers = <table>") 675 L.requireFailure("require 'lanes'.configure{with_timers = {}}");
605 { 676 }
606 L.requireFailure("require 'lanes'.configure{with_timers = {}}");
607 }
608 677
609 // ----------------------------------------------------------------------------------------- 678 // ---------------------------------------------------------------------------------------------
610 679
611 SECTION("with_timers = <string>") 680 SECTION("with_timers = <string>")
612 { 681 {
613 L.requireFailure("require 'lanes'.configure{with_timers = 'gluh'}"); 682 L.requireFailure("require 'lanes'.configure{with_timers = 'gluh'}");
614 } 683 }
615 684
616 // ----------------------------------------------------------------------------------------- 685 // ---------------------------------------------------------------------------------------------
617 686
618 SECTION("with_timers = <number>") 687 SECTION("with_timers = <number>")
619 { 688 {
620 L.requireFailure("require 'lanes'.configure{with_timers = 1}"); 689 L.requireFailure("require 'lanes'.configure{with_timers = 1}");
621 } 690 }
622 691
623 // ----------------------------------------------------------------------------------------- 692 // ---------------------------------------------------------------------------------------------
624 693
625 SECTION("with_timers = <C function>") 694 SECTION("with_timers = <C function>")
626 { 695 {
627 L.requireFailure("require 'lanes'.configure{with_timers = print}"); 696 L.requireFailure("require 'lanes'.configure{with_timers = print}");
628 } 697 }
629 698
630 // ----------------------------------------------------------------------------------------- 699 // ---------------------------------------------------------------------------------------------
631 700
632 SECTION("with_timers = false") 701 SECTION("with_timers = false")
633 { 702 {
634 L.requireSuccess("require 'lanes'.configure{with_timers = false}"); 703 L.requireSuccess("require 'lanes'.configure{with_timers = false}");
635 } 704 }
636 705
637 // ----------------------------------------------------------------------------------------- 706 // ---------------------------------------------------------------------------------------------
638 707
639 SECTION("with_timers = true") 708 SECTION("with_timers = true")
640 { 709 {
641 L.requireSuccess("require 'lanes'.configure{with_timers = true}"); 710 L.requireSuccess("require 'lanes'.configure{with_timers = true}");
642 }
643 } 711 }
712}
713
714// #################################################################################################
715
716TEST_CASE("lanes.configure.unknown_setting")
717{
718 LuaState L{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ false } };
644 719
645 // ---------------------------------------------------------------------------------------------
646 // any unknown setting should be rejected 720 // any unknown setting should be rejected
647 721
648 SECTION("unknown_setting") 722 SECTION("table setting")
649 { 723 {
650 SECTION("table setting") 724 L.requireFailure("require 'lanes'.configure{[{}] = {}}");
651 { 725 }
652 L.requireFailure("require 'lanes'.configure{[{}] = {}}");
653 }
654 726
655 // ----------------------------------------------------------------------------------------- 727 // ---------------------------------------------------------------------------------------------
656 728
657 SECTION("boolean setting") 729 SECTION("boolean setting")
658 { 730 {
659 L.requireFailure("require 'lanes'.configure{[true] = 'gluh'}"); 731 L.requireFailure("require 'lanes'.configure{[true] = 'gluh'}");
660 } 732 }
661 733
662 // ----------------------------------------------------------------------------------------- 734 // ---------------------------------------------------------------------------------------------
663 735
664 SECTION("function setting") 736 SECTION("function setting")
665 { 737 {
666 L.requireFailure("require 'lanes'.configure{[function() end] = 1}"); 738 L.requireFailure("require 'lanes'.configure{[function() end] = 1}");
667 } 739 }
668 740
669 // ----------------------------------------------------------------------------------------- 741 // ---------------------------------------------------------------------------------------------
670 742
671 SECTION("number setting") 743 SECTION("number setting")
672 { 744 {
673 L.requireFailure("require 'lanes'.configure{[1] = function() end}"); 745 L.requireFailure("require 'lanes'.configure{[1] = function() end}");
674 } 746 }
675 747
676 // ----------------------------------------------------------------------------------------- 748 // ---------------------------------------------------------------------------------------------
677 749
678 SECTION("unknown string setting") 750 SECTION("unknown string setting")
679 { 751 {
680 L.requireFailure("require 'lanes'.configure{['gluh'] = false}"); 752 L.requireFailure("require 'lanes'.configure{['gluh'] = false}");
681 }
682 } 753 }
683} 754}
684 755
diff --git a/unit_tests/linda_tests.cpp b/unit_tests/linda_tests.cpp
index f2934eb..9dbaa85 100644
--- a/unit_tests/linda_tests.cpp
+++ b/unit_tests/linda_tests.cpp
@@ -3,67 +3,132 @@
3 3
4// ################################################################################################# 4// #################################################################################################
5 5
6TEST_CASE("linda.single Keeper") 6TEST_CASE("linda.single_keeper.creation/no_argument")
7{ 7{
8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } }; 8 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
9 S.requireSuccess("lanes = require 'lanes'"); 9 S.requireSuccess("lanes = require 'lanes'");
10 10
11 SECTION("Linda creation") 11 // no argument is ok
12 { 12 S.requireSuccess("lanes.linda()");
13 // no parameters is ok 13 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
14 S.requireSuccess("lanes.linda()"); 14}
15 S.requireNotReturnedString("return tostring(lanes.linda())", R"===(Linda: <not a string>)==="); // unspecified name should not result in <not a string>
16
17 // since we have only one keeper, only group 0 is authorized
18 S.requireFailure("lanes.linda(-1)");
19 S.requireSuccess("lanes.linda(0)");
20 S.requireFailure("lanes.linda(1)");
21
22 // any name is ok
23 S.requireSuccess("lanes.linda('')"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
24 S.requireReturnedString("return tostring(lanes.linda('short name'))", R"===(Linda: short name)===");
25 S.requireReturnedString("return tostring(lanes.linda('very very very very very very long name'))", R"===(Linda: very very very very very very long name)===");
26 S.requireReturnedString("return tostring(lanes.linda('auto'))", R"===(Linda: [string "return tostring(lanes.linda('auto'))"]:1)===");
27
28 if constexpr (LUA_VERSION_NUM == 504) {
29 // a function is acceptable as a __close handler
30 S.requireSuccess("local l <close> = lanes.linda(function() end)");
31 // a callable table too (a callable full userdata as well, but I have none here)
32 S.requireSuccess("local l <close> = lanes.linda(setmetatable({}, {__call = function() end}))");
33 // if the function raises an error, we should get it
34 S.requireFailure("local l <close> = lanes.linda(function() error 'gluh' end)");
35 } else {
36 // no __close support before Lua 5.4
37 S.requireFailure("lanes.linda(function() end)");
38 S.requireFailure("lanes.linda(setmetatable({}, {__call = function() end}))");
39 }
40 15
41 // mixing parameters in any order is ok: 2 out of 3 16// #################################################################################################
42 S.requireSuccess("lanes.linda(0, 'name')");
43 S.requireSuccess("lanes.linda('name', 0)");
44 if constexpr (LUA_VERSION_NUM == 504) {
45 S.requireSuccess("lanes.linda(0, function() end)");
46 S.requireSuccess("lanes.linda(function() end, 0)");
47 S.requireSuccess("lanes.linda('name', function() end)");
48 S.requireSuccess("lanes.linda(function() end, 'name')");
49 }
50 17
51 // mixing parameters in any order is ok: 3 out of 3 18TEST_CASE("linda.single_keeper.creation/non_table_arguments")
52 if constexpr (LUA_VERSION_NUM == 504) { 19{
53 S.requireSuccess("lanes.linda(0, 'name', function() end)"); 20 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
54 S.requireSuccess("lanes.linda(0, function() end, 'name')"); 21 S.requireSuccess("lanes = require 'lanes'");
55 S.requireSuccess("lanes.linda('name', 0, function() end)"); 22
56 S.requireSuccess("lanes.linda('name', function() end, 0)"); 23 // any argument that is not a table is not ok
57 S.requireSuccess("lanes.linda(function() end, 0, 'name')"); 24 S.requireFailure("lanes.linda(0)");
58 S.requireSuccess("lanes.linda(function() end, 'name', 0)"); 25 S.requireFailure("lanes.linda('bob')");
59 } 26 S.requireFailure("lanes.linda(false)");
27 S.requireFailure("lanes.linda(function() end)");
28 S.requireFailure("lanes.linda(lanes.cancel_error)");
29}
30
31// #################################################################################################
32
33TEST_CASE("linda.single_keeper.creation/close_handler")
34{
35 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
36 S.requireSuccess("lanes = require 'lanes'");
37
38 if constexpr (LUA_VERSION_NUM == 504) {
39 // a function is acceptable as a __close handler
40 S.requireSuccess("local l <close> = lanes.linda{close_handler = function() end}");
41 // a callable table too (a callable full userdata as well, but I have none here)
42 S.requireSuccess("local l <close> = lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
43 } else {
44 // no __close support before Lua 5.4, field is ignored (therefore invalid values are accepted too!)
45 S.requireSuccess("lanes.linda{close_handler = 'a string'}");
46 S.requireSuccess("lanes.linda{close_handler = function() end}");
47 S.requireSuccess("lanes.linda{close_handler = setmetatable({}, {__call = function() end})}");
48 }
49}
50
51// #################################################################################################
52
53TEST_CASE("linda.single_keeper.creation/table_argument")
54{
55 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
56 S.requireSuccess("lanes = require 'lanes'");
57
58 // one table is fine
59 S.requireSuccess("lanes.linda{}");
60 // anything beyond that is not
61 S.requireFailure("lanes.linda({},{})");
62 S.requireFailure("lanes.linda({},'bob')");
63 S.requireFailure("lanes.linda({},42)");
64}
65
66// #################################################################################################
67
68TEST_CASE("linda.single_keeper.creation/group")
69{
70 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
71 S.requireSuccess("lanes = require 'lanes'");
72
73 // since we have only one keeper, only group 0 is authorized
74 S.requireFailure("lanes.linda{group = -1}");
75 S.requireSuccess("lanes.linda{group = 0}");
76 S.requireFailure("lanes.linda{group = 1}");
77}
78
79// #################################################################################################
80
81TEST_CASE("linda.single_keeper.creation/name")
82{
83 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
84 S.requireSuccess("lanes = require 'lanes'");
85
86 // any name is ok
87 S.requireSuccess("lanes.linda{name = ''}"); // an empty name results in a string conversion of the form "Linda: <some hex value>" that we can't test (but it works)
88 S.requireReturnedString("return tostring(lanes.linda{name = 'short name'})", R"===(Linda: short name)===");
89 S.requireReturnedString("return tostring(lanes.linda{name = 'very very very very very very long name'})", R"===(Linda: very very very very very very long name)===");
90 S.requireReturnedString("return tostring(lanes.linda{name = 'auto'})", R"===(Linda: [string "return tostring(lanes.linda{name = 'auto'})"]:1)===");
91}
92
93// #################################################################################################
94
95TEST_CASE("linda.single_keeper.creation/wake_period")
96{
97 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
98 S.requireSuccess("lanes = require 'lanes'");
60 99
61 // unsupported parameters should fail 100 // wake_period should be a number > 0
62 S.requireFailure("lanes.linda(true)"); 101 S.requireFailure("lanes.linda{wake_period = false}");
63 S.requireFailure("lanes.linda(false)"); 102 S.requireFailure("lanes.linda{wake_period = 'bob'}");
64 // uncallable table or full userdata 103 S.requireFailure("lanes.linda{wake_period = {}}");
65 S.requireFailure("lanes.linda({})"); 104 S.requireFailure("lanes.linda{wake_period = -1}");
66 S.requireFailure("lanes.linda(lanes.linda())"); 105 S.requireFailure("lanes.linda{wake_period = 0}");
106 S.requireSuccess("lanes.linda{wake_period = 0.0001}");
107}
108
109// #################################################################################################
110
111TEST_CASE("linda.single_keeper.wake_period")
112{
113 FAIL("TODO: check that wake_period works as expected");
114 // - use configure default if not provided
115 // - overrides default when provided
116 // - blocking operation wakes at the specified period
117}
118
119// #################################################################################################
120
121TEST_CASE("linda.single_keeper.the_rest")
122{
123 LuaState S{ LuaState::WithBaseLibs{ true }, LuaState::WithFixture{ true } };
124 S.requireSuccess("lanes = require 'lanes'");
125
126 // ---------------------------------------------------------------------------------------------
127
128 SECTION("error in close handler is propagated")
129 {
130 // if the function raises an error, we should get it
131 S.requireFailure("local l <close> = lanes.linda{close_handler = function() error 'gluh' end}");
67 } 132 }
68 133
69 // --------------------------------------------------------------------------------------------- 134 // ---------------------------------------------------------------------------------------------
@@ -311,12 +376,12 @@ TEST_CASE("linda.multi Keeper")
311 376
312 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}"); 377 S.requireSuccess("lanes = require 'lanes'.configure{nb_user_keepers = 3}");
313 378
314 S.requireFailure("lanes.linda(-1)"); 379 S.requireFailure("lanes.linda{group = -1}");
315 S.requireSuccess("lanes.linda(0)"); 380 S.requireSuccess("lanes.linda{group = 0}");
316 S.requireSuccess("lanes.linda(1)"); 381 S.requireSuccess("lanes.linda{group = 1}");
317 S.requireSuccess("lanes.linda(2)"); 382 S.requireSuccess("lanes.linda{group = 2}");
318 S.requireSuccess("lanes.linda(3)"); 383 S.requireSuccess("lanes.linda{group = 3}");
319 S.requireFailure("lanes.linda(4)"); 384 S.requireFailure("lanes.linda{group = 4}");
320} 385}
321 386
322// ################################################################################################# 387// #################################################################################################
diff --git a/unit_tests/scripts/lane/tasking_cancelling.lua b/unit_tests/scripts/lane/tasking_cancelling.lua
index ea4516e..873140e 100644
--- a/unit_tests/scripts/lane/tasking_cancelling.lua
+++ b/unit_tests/scripts/lane/tasking_cancelling.lua
@@ -16,7 +16,7 @@ local lanes_linda = assert(lanes.linda)
16-- ################################################################################################## 16-- ##################################################################################################
17 17
18-- cancellation of lanes waiting on a linda 18-- cancellation of lanes waiting on a linda
19local limited = lanes_linda("limited") 19local limited = lanes_linda{name = "limited"}
20assert.fails(function() limited:limit("key", -1) end) 20assert.fails(function() limited:limit("key", -1) end)
21assert.failsnot(function() limited:limit("key", 1) end) 21assert.failsnot(function() limited:limit("key", 1) end)
22-- [[################################################ 22-- [[################################################
diff --git a/unit_tests/scripts/lane/tasking_comms_criss_cross.lua b/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
index 497e81d..610da8b 100644
--- a/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
+++ b/unit_tests/scripts/lane/tasking_comms_criss_cross.lua
@@ -42,7 +42,7 @@ local tc = lanes_gen("io", { name = 'auto', gc_cb = gc_cb },
42 end 42 end
43) 43)
44 44
45local linda= lanes_linda("criss cross") 45local linda= lanes_linda{name = "criss cross"}
46 46
47local a,b= tc(linda, "A","B"), tc(linda, "B","A") -- launching two lanes, twisted comms 47local a,b= tc(linda, "A","B"), tc(linda, "B","A") -- launching two lanes, twisted comms
48 48
diff --git a/unit_tests/scripts/lane/tasking_communications.lua b/unit_tests/scripts/lane/tasking_communications.lua
index 631d105..01842b4 100644
--- a/unit_tests/scripts/lane/tasking_communications.lua
+++ b/unit_tests/scripts/lane/tasking_communications.lua
@@ -72,7 +72,7 @@ local chunk= function(linda)
72 WR("chunk ", "Lane ends!\n") 72 WR("chunk ", "Lane ends!\n")
73end 73end
74 74
75local linda = lanes_linda("communications") 75local linda = lanes_linda{name = "communications"}
76assert(type(linda) == "userdata" and tostring(linda) == "Linda: communications") 76assert(type(linda) == "userdata" and tostring(linda) == "Linda: communications")
77 -- 77 --
78 -- ["->"] master -> slave 78 -- ["->"] master -> slave
diff --git a/unit_tests/scripts/lane/tasking_send_receive_code.lua b/unit_tests/scripts/lane/tasking_send_receive_code.lua
index e329a88..cb3663f 100644
--- a/unit_tests/scripts/lane/tasking_send_receive_code.lua
+++ b/unit_tests/scripts/lane/tasking_send_receive_code.lua
@@ -65,7 +65,7 @@ local function chunk2(linda)
65 linda:send("up", function() return ":)" end, "ok2") 65 linda:send("up", function() return ":)" end, "ok2")
66end 66end
67 67
68local linda = lanes_linda("auto") 68local linda = lanes_linda{name = "auto"}
69local t2= lanes_gen("debug,package,string,io", { name = 'auto', gc_cb = gc_cb }, chunk2)(linda) -- prepare & launch 69local t2= lanes_gen("debug,package,string,io", { name = 'auto', gc_cb = gc_cb }, chunk2)(linda) -- prepare & launch
70linda:send("down", function(linda) linda:send("up", "ready!") end, 70linda:send("down", function(linda) linda:send("up", "ready!") end,
71 "ok") 71 "ok")
diff --git a/unit_tests/scripts/linda/multiple_keepers.lua b/unit_tests/scripts/linda/multiple_keepers.lua
index 8733087..267d874 100644
--- a/unit_tests/scripts/linda/multiple_keepers.lua
+++ b/unit_tests/scripts/linda/multiple_keepers.lua
@@ -2,9 +2,9 @@
2local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 3, keepers_gc_threshold = 500} 2local require_lanes_result_1, require_lanes_result_2 = require "lanes".configure{nb_user_keepers = 3, keepers_gc_threshold = 500}
3local lanes = require_lanes_result_1 3local lanes = require_lanes_result_1
4 4
5local a = lanes.linda("A", 1) 5local a = lanes.linda{name = "A", group = 1}
6local b = lanes.linda("B", 2) 6local b = lanes.linda{name = "B", group = 2}
7local c = lanes.linda("C", 3) 7local c = lanes.linda{name = "C", group = 3}
8 8
9-- store each linda in the other 2 9-- store each linda in the other 2
10do 10do
diff --git a/unit_tests/scripts/linda/send_registered_userdata.lua b/unit_tests/scripts/linda/send_registered_userdata.lua
index 2c0195a..90c05c9 100644
--- a/unit_tests/scripts/linda/send_registered_userdata.lua
+++ b/unit_tests/scripts/linda/send_registered_userdata.lua
@@ -1,5 +1,5 @@
1local lanes = require 'lanes'.configure{with_timers = false} 1local lanes = require 'lanes'.configure{with_timers = false}
2local l = lanes.linda'gleh' 2local l = lanes.linda{name = 'gleh'}
3l:set('yo', io.stdin) 3l:set('yo', io.stdin)
4local n, stdin_out = l:get('yo') 4local n, stdin_out = l:get('yo')
5assert(n == 1 and stdin_out == io.stdin, tostring(stdin_out) .. " ~= " .. tostring(io.stdin)) 5assert(n == 1 and stdin_out == io.stdin, tostring(stdin_out) .. " ~= " .. tostring(io.stdin))