/*****************************************************************************
PURPOSE: SIM object used to Exercise the features and failure cases of the 
MonteCarloGeneration model.
PROGRAMMERS:
  (((Isaac Reaves) (NASA) (November 2022) (Integration into Trick Core)))
*****************************************************************************/
#include "sim_objects/default_trick_sys.sm"
#include "sim_objects/MonteCarloGenerate.sm"

/*****************************************************************************
MC_Test sim object
****************************************************************************/

class MC_TestSimObject : public Trick::SimObject
{
 public:
  double x_uniform;
  double x_normal;
  double x_normal_trunc[5];
  double x_normal_length; // (m) Dispersed in ft.
  double x_line_command;
  double x_file_command[3];
  double x_file_lookup[3];
  double x_fixed_value_double;
  double x_semi_fixed_value;
  int    x_fixed_value_int;
  int    x_integer;
  bool   x_boolean;
  std::string x_string;
  std::string x_fixed_value_string;
  int    x_sdefine_routine_called;

  MonteCarloVariableFile mc_var_file;

  MC_TestSimObject()
      :
      mc_var_file("test.x_file_lookup[0]", "Modified_data/datafile.txt", 3)
  {
    ("initialization") monte_carlo.generate_dispersions();
    (1.0,"environment") output_strings();
  };

  // standalone_function is used to test using an instance of
  // MonteCarloPythonLineExec to execute a standalone function.
  void standalone_function( double value)
  {
    std::cout << "\nStandalone_function received a value of " << value << "\n";
    x_sdefine_routine_called = 1;
  }
 private:
  void output_strings() {
    std::cout << "\nstrings : " << x_string << " : " << x_fixed_value_string << "\n";
  }
  MC_TestSimObject( const MC_TestSimObject&);
  MC_TestSimObject & operator= ( const MC_TestSimObject&);

};
MC_TestSimObject test;
