Skip to content
LIBRARY
Sources.Tests.SineModes.md

Sources.Tests.SineModes

Verifies all operating modes of the Sine source against analytically known values.

Four Sine instances share amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = π/4 (so 2π·frequency·start_time = π, half a cycle) and differ only in the continuous and shift_time parameters:

  • sig_default : new parameters left at their defaults (continuous = true, shift_time = start_time). Confirms the default reproduces the legacy value-continuous behavior (no breaking change).

  • sig_gated : continuous = false, shift_time = start_time — output holds at offset before start_time.

  • sig_gated_abs: continuous = false, shift_time = 0 — gated output with absolute time reference.

  • sig_hold_abs : continuous = true, shift_time = 0 — value-continuous output with absolute time reference.

Each signal feeds an integrator so the test checks both the instantaneous output (at time = 0, in the pre-start region, and at the stop time, in the active region) and the accumulated integral.

Usage

BlockComponents.Sources.Tests.SineModes()

Behavior

Source

dyad
"""
Verifies all operating modes of the Sine source against analytically known values.

Four `Sine` instances share `amplitude = 2`, `frequency = 1`, `start_time = 0.5`,
`offset = 1`, `phase = π/4` (so `2π·frequency·start_time = π`, half a cycle) and differ
only in the `continuous` and `shift_time` parameters:

- `sig_default`  : new parameters left at their defaults (`continuous = true`, `shift_time = start_time`).
                   Confirms the default reproduces the legacy value-continuous behavior (no breaking change).
- `sig_gated`    : `continuous = false`, `shift_time = start_time` — output holds at `offset` before `start_time`.
- `sig_gated_abs`: `continuous = false`, `shift_time = 0`          — gated output with absolute time reference.
- `sig_hold_abs` : `continuous = true`,  `shift_time = 0`          — value-continuous output with absolute time reference.

Each signal feeds an integrator so the test checks both the instantaneous output
(at `time = 0`, in the pre-start region, and at the stop time, in the active region)
and the accumulated integral.
"""
test component SineModes
  sig_default = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
      },
      "tags": []
    }
  }
  sig_gated = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = false) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 140, "x2": 120, "y2": 240, "rot": 0}
      },
      "tags": []
    }
  }
  sig_gated_abs = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = false, shift_time = 0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 260, "x2": 120, "y2": 360, "rot": 0}
      },
      "tags": []
    }
  }
  sig_hold_abs = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = true, shift_time = 0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 380, "x2": 120, "y2": 480, "rot": 0}
      },
      "tags": []
    }
  }
  int_default = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 20, "x2": 260, "y2": 120, "rot": 0}
      },
      "tags": []
    }
  }
  int_gated = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 140, "x2": 260, "y2": 240, "rot": 0}
      },
      "tags": []
    }
  }
  int_gated_abs = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 260, "x2": 260, "y2": 360, "rot": 0}
      },
      "tags": []
    }
  }
  int_hold_abs = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 380, "x2": 260, "y2": 480, "rot": 0}
      },
      "tags": []
    }
  }
relations
  connect(sig_default.y, int_default.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_gated.y, int_gated.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_gated_abs.y, int_gated_abs.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_hold_abs.y, int_hold_abs.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
  "Dyad": {
    "icons": {"default": "dyad://BlockComponents/Example.svg"},
    "tests": {
      "case1": {
        "stop": 2,
        "abstol": 1e-8,
        "reltol": 1e-8,
        "atol": {
          "sig_default.y": 0.01,
          "sig_gated.y": 0.01,
          "sig_gated_abs.y": 0.01,
          "sig_hold_abs.y": 0.01,
          "int_default.x": 0.01,
          "int_gated.x": 0.01,
          "int_gated_abs.x": 0.01,
          "int_hold_abs.x": 0.01
        },
        "expect": {
          "initial": {
            "sig_default.y": 2.4142,
            "sig_gated.y": 1,
            "sig_gated_abs.y": 1,
            "sig_hold_abs.y": -0.4142
          },
          "signals": ["sig_default.y", "sig_gated.y", "sig_gated_abs.y", "sig_hold_abs.y"],
          "final": {
            "sig_default.y": -0.4142,
            "sig_gated.y": -0.4142,
            "sig_gated_abs.y": 2.4142,
            "sig_hold_abs.y": 2.4142,
            "int_default.x": 3.1573,
            "int_gated.x": 2.4502,
            "int_gated_abs.x": 1.5498,
            "int_hold_abs.x": 0.8427
          }
        }
      }
    }
  }
}
end
Flattened Source
dyad
"""
Verifies all operating modes of the Sine source against analytically known values.

Four `Sine` instances share `amplitude = 2`, `frequency = 1`, `start_time = 0.5`,
`offset = 1`, `phase = π/4` (so `2π·frequency·start_time = π`, half a cycle) and differ
only in the `continuous` and `shift_time` parameters:

- `sig_default`  : new parameters left at their defaults (`continuous = true`, `shift_time = start_time`).
                   Confirms the default reproduces the legacy value-continuous behavior (no breaking change).
- `sig_gated`    : `continuous = false`, `shift_time = start_time` — output holds at `offset` before `start_time`.
- `sig_gated_abs`: `continuous = false`, `shift_time = 0`          — gated output with absolute time reference.
- `sig_hold_abs` : `continuous = true`,  `shift_time = 0`          — value-continuous output with absolute time reference.

Each signal feeds an integrator so the test checks both the instantaneous output
(at `time = 0`, in the pre-start region, and at the stop time, in the active region)
and the accumulated integral.
"""
test component SineModes
  sig_default = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
      },
      "tags": []
    }
  }
  sig_gated = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = false) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 140, "x2": 120, "y2": 240, "rot": 0}
      },
      "tags": []
    }
  }
  sig_gated_abs = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = false, shift_time = 0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 260, "x2": 120, "y2": 360, "rot": 0}
      },
      "tags": []
    }
  }
  sig_hold_abs = BlockComponents.Sources.Sine(amplitude = 2, frequency = 1, start_time = 0.5, offset = 1, phase = pi / 4, continuous = true, shift_time = 0) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 20, "y1": 380, "x2": 120, "y2": 480, "rot": 0}
      },
      "tags": []
    }
  }
  int_default = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 20, "x2": 260, "y2": 120, "rot": 0}
      },
      "tags": []
    }
  }
  int_gated = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 140, "x2": 260, "y2": 240, "rot": 0}
      },
      "tags": []
    }
  }
  int_gated_abs = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 260, "x2": 260, "y2": 360, "rot": 0}
      },
      "tags": []
    }
  }
  int_hold_abs = BlockComponents.Continuous.Integrator() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 160, "y1": 380, "x2": 260, "y2": 480, "rot": 0}
      },
      "tags": []
    }
  }
relations
  connect(sig_default.y, int_default.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_gated.y, int_gated.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_gated_abs.y, int_gated_abs.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(sig_hold_abs.y, int_hold_abs.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
  "Dyad": {
    "icons": {"default": "dyad://BlockComponents/Example.svg"},
    "tests": {
      "case1": {
        "stop": 2,
        "abstol": 1e-8,
        "reltol": 1e-8,
        "atol": {
          "sig_default.y": 0.01,
          "sig_gated.y": 0.01,
          "sig_gated_abs.y": 0.01,
          "sig_hold_abs.y": 0.01,
          "int_default.x": 0.01,
          "int_gated.x": 0.01,
          "int_gated_abs.x": 0.01,
          "int_hold_abs.x": 0.01
        },
        "expect": {
          "initial": {
            "sig_default.y": 2.4142,
            "sig_gated.y": 1,
            "sig_gated_abs.y": 1,
            "sig_hold_abs.y": -0.4142
          },
          "signals": ["sig_default.y", "sig_gated.y", "sig_gated_abs.y", "sig_hold_abs.y"],
          "final": {
            "sig_default.y": -0.4142,
            "sig_gated.y": -0.4142,
            "sig_gated_abs.y": 2.4142,
            "sig_hold_abs.y": 2.4142,
            "int_default.x": 3.1573,
            "int_gated.x": 2.4502,
            "int_gated_abs.x": 1.5498,
            "int_hold_abs.x": 0.8427
          }
        }
      }
    }
  }
}
end


Test Cases

Test Case case1

julia
plt

julia
plt

julia
plt

julia
plt