diff --git a/.gitattributes b/.gitattributes
index 065265706..bad6b35de 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,4 @@
-*.sh text eol=lf
\ No newline at end of file
+*.sh text eol=lf
+
+install/opm text eol=lf
+install/oscript text eol=lf
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index b9644c37b..9808531a8 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -4,20 +4,6 @@ about: Предложить идею для проекта
---
-
-
# Описание задачи
**Опишите вашу Цель, которую вы сможете достичь с помощью новой функциональности**
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..8331a54b4
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
+
diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml
new file mode 100644
index 000000000..c06a1bcdf
--- /dev/null
+++ b/.github/workflows/rebase.yml
@@ -0,0 +1,19 @@
+name: Automatic Rebase
+on:
+ issue_comment:
+ types: [created]
+jobs:
+ rebase:
+ name: Rebase
+ if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase')
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the latest code
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ fetch-depth: 0 # otherwise, you will fail to push refs to dest repo
+ - name: Automatic Rebase
+ uses: cirrus-actions/rebase@1.8
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/sonar.yml b/.github/workflows/sonar.yml
new file mode 100644
index 000000000..ea0b66d77
--- /dev/null
+++ b/.github/workflows/sonar.yml
@@ -0,0 +1,69 @@
+name: QA
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ sonar:
+ name: SonarQube
+ runs-on: windows-latest
+ if: (github.repository == 'EvilBeaver/OneScript' ) && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name)
+ steps:
+ - name: Set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ java-version: 17
+ distribution: temurin
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
+ - name: Cache SonarQube packages
+ uses: actions/cache@v3
+ with:
+ path: ~\sonar\cache
+ key: ${{ runner.os }}-sonar
+ restore-keys: ${{ runner.os }}-sonar
+ - name: Cache SonarQube scanner
+ id: cache-sonar-scanner
+ uses: actions/cache@v3
+ with:
+ path: .\.sonar\scanner
+ key: ${{ runner.os }}-sonar-scanner
+ restore-keys: ${{ runner.os }}-sonar-scanner
+ - name: Install SonarQube scanner
+ if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
+ shell: powershell
+ run: |
+ New-Item -Path .\.sonar\scanner -ItemType Directory
+ dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner
+ - name: Install coverage tool
+ shell: powershell
+ run: |
+ dotnet tool install --global dotnet-coverage
+ - name: Compute branch name
+ uses: nelonoel/branch-name@v1.0.1
+ - name: Prepare analysis (branch)
+ if: github.event_name == 'push'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ shell: powershell
+ run: |
+ .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml /d:sonar.branch.name=${{ env.BRANCH_NAME }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru"
+ - name: Prepare analysis (pull-request)
+ if: github.event_name == 'pull_request'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ shell: powershell
+ run: |
+ .\.sonar\scanner\dotnet-sonarscanner begin /k:"OneScript" /d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml /d:sonar.pullrequest.key=${{ github.event.pull_request.number }} /d:sonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} /d:sonar.pullrequest.base=${{ github.event.pull_request.base.ref }} /d:sonar.scm.revision=${{ github.event.pull_request.head.sha }} /d:sonar.login="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonar.openbsl.ru"
+ - name: Build and analyze
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
+ shell: powershell
+ run: |
+ dotnet publish src/oscript/oscript.csproj
+ dotnet-coverage collect "dotnet msbuild Build_Core.csproj -t:UnitTests" -f xml -o "coverage.xml"
+ .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.login="${{ secrets.SONAR_TOKEN }}"
diff --git a/Build_Core.csproj b/Build_Core.csproj
index 104c1f0ce..94e4a1c82 100644
--- a/Build_Core.csproj
+++ b/Build_Core.csproj
@@ -8,7 +8,6 @@
$(BUILD_NUMBER)
0
- $(MSBuildProjectDirectory)/built
$(MSBuildProjectDirectory)/built
$(ArtifactsRoot)/lib
$(ArtifactsRoot)\vscode\
@@ -70,7 +69,7 @@
ItemName="BuildVariant"/>
-
+
$(MSBuildProjectDirectory)/src/ScriptEngine.NativeApi/bin/$(Configuration)
@@ -84,6 +83,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -96,9 +105,9 @@
-
+
-
+
$(MSBuildProjectDirectory)/src/ScriptEngine.NativeApi/bin/$(Configuration)
@@ -110,6 +119,15 @@
+
+
+
+
+
+
+
+
+
@@ -163,11 +181,10 @@
-
-
+
+
-
@@ -187,7 +204,8 @@
+ Condition="'$(SkipLibraryDownload)' == ''"
+ UseUtf8Encoding="Always"/>
@@ -239,6 +257,7 @@
WorkingDirectory="$(TestsRoot)/%(TestAssemblies.Identity)"
Command="dotnet test --logger:"junit;LogFilePath=$(MSBuildProjectDirectory)/tests/%(TestAssemblies.Identity).xml""
IgnoreExitCode="true"
+ UseUtf8Encoding="Always"
/>
@@ -255,7 +274,14 @@
-
+
+
+
@@ -284,7 +310,7 @@
-
+
@@ -323,7 +349,7 @@
+ Command="dotnet nuget push %(NugetAbleProject.Identity).$(ReleaseNumber).nupkg -k $(NugetToken) -s https://api.nuget.org/v3/index.json" UseUtf8Encoding="Always"/>
diff --git a/Jenkinsfile b/Jenkinsfile
index 7f667e038..4213103b5 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -5,29 +5,29 @@ pipeline {
environment {
VersionPrefix = '2.0.0'
- VersionSuffix = 'rc2'
+ VersionSuffix = 'rc3'
outputEnc = '65001'
}
stages {
+ stage('Prepare Linux Environment') {
+ agent{ label 'master'}
+ steps{
+ dir('install'){
+ sh 'chmod +x make-dockers.sh && ./make-dockers.sh'
+ }
+ withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) {
+ sh """
+ docker login -p $dockerpassword -u $dockeruser
+ docker push oscript/onescript-builder:deb
+ docker push oscript/onescript-builder:rpm
+ docker push oscript/onescript-builder:gcc
+ """.stripIndent()
+ }
+ }
+ }
stage('Build'){
parallel {
- stage('Prepare Linux Environment') {
- agent{ label 'master'}
- steps{
- dir('install'){
- sh 'chmod +x make-dockers.sh && ./make-dockers.sh'
- }
- withCredentials([usernamePassword(credentialsId: 'docker-hub', passwordVariable: 'dockerpassword', usernameVariable: 'dockeruser')]) {
- sh """
- docker login -p $dockerpassword -u $dockeruser
- docker push oscript/onescript-builder:deb
- docker push oscript/onescript-builder:rpm
- """.stripIndent()
- }
- }
- }
-
stage('Windows Build') {
agent { label 'windows' }
@@ -64,6 +64,32 @@ pipeline {
}
}
}
+
+ stage('Linux Build') {
+ agent {
+ docker {
+ image 'oscript/onescript-builder:gcc'
+ label 'linux'
+ }
+ }
+
+ steps {
+ sh 'mkdir -p built/tmp/na-proxy && mkdir -p built/tmp/na-tests'
+ dir('src/ScriptEngine.NativeApi') {
+ sh './build.sh'
+ sh 'cp *.so ../../built/tmp/na-proxy'
+ }
+ dir('tests/native-api') {
+ sh './build.sh'
+ sh 'cp *.so ../../built/tmp/na-tests'
+ }
+ dir('output') {
+ sh 'cp -Rv ../built/tmp/* .'
+ }
+ stash includes: 'output/na-proxy/*.so', name: 'nativeApiSo'
+ stash includes: 'output/na-tests/*.so', name: 'nativeApiTestsSo'
+ }
+ }
}
}
stage('VSCode debugger Build') {
@@ -125,6 +151,11 @@ pipeline {
}
unstash 'buildResults'
+ unstash 'nativeApiSo'
+ unstash 'nativeApiTestsSo'
+
+ sh 'cp output/na-proxy/*.so ./built/linux-x64/bin/'
+ sh 'mkdir -p tests/native-api/build64 && cp output/na-tests/*.so ./tests/native-api/build64/'
sh '''\
if [ ! -d lintests ]; then
@@ -154,6 +185,10 @@ pipeline {
}
unstash 'buildResults'
+ unstash 'nativeApiSo'
+
+ bat 'xcopy output\\na-proxy\\*64.so built\\linux-64\\bin\\'
+
script
{
if (env.BRANCH_NAME == "preview") {
@@ -197,7 +232,7 @@ pipeline {
}
}
- stage ('Publishing preview') {
+ stage ('Publishing preview') {
when { anyOf {
branch 'release/preview';
}
diff --git a/README.md b/README.md
index c9efffdaf..7737b5d62 100644
--- a/README.md
+++ b/README.md
@@ -46,3 +46,11 @@ OneScript позволяет создавать и выполнять текст
- выполнить команду `mono ovm.exe install stable`
- выполнить команду `mono ovm.exe use stable`
- перезапустить терминал
+
+Донастройка Self-Contained варианта поставки (не требующего инсталляции dotnet)
+
+```
+chmod +x ./oscript
+xattr -d com.apple.quarantine *.dylib oscript
+codesign -s - ./oscript
+```
diff --git a/install/builders/deb/oscript b/install/builders/deb/oscript
index 65af38659..3644f82d4 100755
--- a/install/builders/deb/oscript
+++ b/install/builders/deb/oscript
@@ -1,3 +1,3 @@
#!/bin/sh
-mono /usr/share/oscript/bin/oscript.exe "$@"
+dotnet /usr/share/oscript/bin/oscript.dll "$@"
diff --git a/install/builders/deb/oscript-cgi b/install/builders/deb/oscript-cgi
index f62a3fe07..caca00423 100755
--- a/install/builders/deb/oscript-cgi
+++ b/install/builders/deb/oscript-cgi
@@ -4,5 +4,5 @@ if [ -z "$SCRIPT_FILENAME" ]; then
export SCRIPT_FILENAME=$1
fi
-mono /usr/share/oscript/bin/oscript.exe -cgi "$@"
+oscript -cgi "$@"
diff --git a/install/builders/deb/oscript-opm b/install/builders/deb/oscript-opm
index f847629a6..1c357d9c4 100755
--- a/install/builders/deb/oscript-opm
+++ b/install/builders/deb/oscript-opm
@@ -1,4 +1,4 @@
#!/bin/sh
OSPATH=/usr/share/oscript
-mono $OSPATH/bin/oscript.exe $OSPATH/lib/opm/src/cmd/opm.os "$@"
+oscript $OSPATH/lib/opm/src/cmd/opm.os "$@"
diff --git a/install/builders/msi/README.md b/install/builders/msi/README.md
deleted file mode 100644
index 394545228..000000000
--- a/install/builders/msi/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# WiX wili be here
\ No newline at end of file
diff --git a/install/builders/nativeapi/Dockerfile b/install/builders/nativeapi/Dockerfile
index e65d29dde..c3df70df9 100644
--- a/install/builders/nativeapi/Dockerfile
+++ b/install/builders/nativeapi/Dockerfile
@@ -2,21 +2,4 @@ FROM ubuntu:18.04
RUN apt-get update -qq \
&& dpkg --add-architecture i386 \
- && apt-get install -y -qq build-essential cmake uuid-dev libc6-dev gcc-multilib g++-multilib
-
-WORKDIR /src/proxy
-COPY /src/ScriptEngine.NativeApi /src/proxy
-RUN chmod +x build.sh && ./build.sh
-
-WORKDIR /src/tests
-COPY /tests/native-api /src/tests
-RUN chmod +x build.sh && ./build.sh
-
-RUN cd / \
- && mkdir built \
- && mkdir built/tmp \
- && mkdir built/tmp/bin \
- && mkdir built/tmp/tests \
- && cp /src/proxy/*.so built/tmp/bin \
- && cp /src/tests/*.so built/tmp/tests \
- && chmod -x built/tmp/bin/*.so
\ No newline at end of file
+ && apt-get install -y -qq build-essential cmake uuid-dev libc6-dev gcc-multilib g++-multilib
\ No newline at end of file
diff --git a/install/builders/rpm/oscript b/install/builders/rpm/oscript
index 65af38659..3644f82d4 100644
--- a/install/builders/rpm/oscript
+++ b/install/builders/rpm/oscript
@@ -1,3 +1,3 @@
#!/bin/sh
-mono /usr/share/oscript/bin/oscript.exe "$@"
+dotnet /usr/share/oscript/bin/oscript.dll "$@"
diff --git a/install/builders/rpm/oscript-opm b/install/builders/rpm/oscript-opm
index f847629a6..1c357d9c4 100644
--- a/install/builders/rpm/oscript-opm
+++ b/install/builders/rpm/oscript-opm
@@ -1,4 +1,4 @@
#!/bin/sh
OSPATH=/usr/share/oscript
-mono $OSPATH/bin/oscript.exe $OSPATH/lib/opm/src/cmd/opm.os "$@"
+oscript $OSPATH/lib/opm/src/cmd/opm.os "$@"
diff --git a/install/opm b/install/opm
new file mode 100644
index 000000000..e6e62bc7b
--- /dev/null
+++ b/install/opm
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+THISDIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+LIB="$THISDIR/../lib"
+OPM=$LIB/opm/src/cmd/opm.os
+
+oscript $OPM "$@"
diff --git a/install/opm.bat b/install/opm.bat
index 3fd12a362..1105eba2c 100644
--- a/install/opm.bat
+++ b/install/opm.bat
@@ -5,4 +5,4 @@ setlocal
set lib="%~dp0..\lib"
set opm=%lib%\opm\src\cmd\opm.os
-oscript.exe %opm% %*
+oscript %opm% %*
diff --git a/install/opm.ospx b/install/opm.ospx
index 36365671f..661b6ff2b 100644
Binary files a/install/opm.ospx and b/install/opm.ospx differ
diff --git a/install/oscript b/install/oscript
new file mode 100644
index 000000000..d2cbc30be
--- /dev/null
+++ b/install/oscript
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+THISDIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+dotnet "$THISDIR/oscript.dll" "$@"
diff --git a/install/oscript.bat b/install/oscript.bat
new file mode 100644
index 000000000..abb4ca583
--- /dev/null
+++ b/install/oscript.bat
@@ -0,0 +1,3 @@
+@echo off
+
+dotnet %~dp0oscript.dll %*
diff --git a/src/1Script.sln b/src/1Script.sln
index fc18d92e7..9da3cfeaf 100644
--- a/src/1Script.sln
+++ b/src/1Script.sln
@@ -20,6 +20,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
..\Build.csproj = ..\Build.csproj
oscommon.targets = oscommon.targets
..\Build_Core.csproj = ..\Build_Core.csproj
+ ..\Jenkinsfile = ..\Jenkinsfile
EndProjectSection
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{BBE794A6-B159-422F-B655-B7F03F25F223}"
diff --git a/src/OneScript.Core/Commons/IndexedNameValueCollection.cs b/src/OneScript.Core/Commons/IndexedNameValueCollection.cs
index 059764382..94e2631ff 100644
--- a/src/OneScript.Core/Commons/IndexedNameValueCollection.cs
+++ b/src/OneScript.Core/Commons/IndexedNameValueCollection.cs
@@ -58,7 +58,7 @@ public T this[string name]
public void AddName(int index, string name)
{
if (index < 0 || index >= _values.Count)
- throw new ArgumentOutOfRangeException();
+ throw new ArgumentOutOfRangeException(nameof(index));
_nameIndex[name] = index;
}
diff --git a/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs b/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs
new file mode 100644
index 000000000..bca92f5e2
--- /dev/null
+++ b/src/OneScript.Core/Compilation/Binding/AliasedVariableSymbol.cs
@@ -0,0 +1,34 @@
+/*----------------------------------------------------------
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v.2.0. If a copy of the MPL
+was not distributed with this file, You can obtain one
+at http://mozilla.org/MPL/2.0/.
+----------------------------------------------------------*/
+using System;
+using OneScript.Values;
+
+namespace OneScript.Compilation.Binding
+{
+ public class AliasedVariableSymbol : IVariableSymbol
+ {
+ public AliasedVariableSymbol(string name, string alias, Type type)
+ {
+ Name = name;
+ Alias = alias;
+ Type = type;
+ }
+
+ public AliasedVariableSymbol(string name, string alias)
+ {
+ Name = name;
+ Alias = alias;
+ Type = typeof(BslValue);
+ }
+
+ public string Name { get; }
+
+ public string Alias { get; }
+
+ public Type Type { get; }
+ }
+}
diff --git a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs
index 10e1ac2ad..7c5ae829c 100644
--- a/src/OneScript.Core/Compilation/Binding/SymbolTable.cs
+++ b/src/OneScript.Core/Compilation/Binding/SymbolTable.cs
@@ -7,7 +7,6 @@ This Source Code Form is subject to the terms of the
using System.Collections.Generic;
using OneScript.Contexts;
-using OneScript.Values;
namespace OneScript.Compilation.Binding
{
@@ -65,7 +64,7 @@ public bool FindVariable(string name, out SymbolBinding binding)
return false;
}
- public bool FindMethod(string name, out SymbolBinding binding)
+ public bool TryFindMethodBinding(string name, out SymbolBinding binding)
{
for (int i = _bindings.Count - 1; i >= 0; i--)
{
@@ -86,6 +85,18 @@ public bool FindMethod(string name, out SymbolBinding binding)
return false;
}
+ public bool TryFindMethod(string name, out IMethodSymbol method)
+ {
+ if (TryFindMethodBinding(name, out var binding))
+ {
+ method = GetMethod(binding);
+ return true;
+ }
+
+ method = default;
+ return false;
+ }
+
public SymbolBinding DefineMethod(IMethodSymbol symbol)
{
var index = _bindings[ScopeCount - 1].scope.DefineMethod(symbol);
diff --git a/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs
new file mode 100644
index 000000000..0fc5b30e3
--- /dev/null
+++ b/src/OneScript.Core/Compilation/ICompileTimeDependencyResolver.cs
@@ -0,0 +1,16 @@
+/*----------------------------------------------------------
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v.2.0. If a copy of the MPL
+was not distributed with this file, You can obtain one
+at http://mozilla.org/MPL/2.0/.
+----------------------------------------------------------*/
+
+using OneScript.Sources;
+
+namespace OneScript.Compilation
+{
+ public interface ICompileTimeDependencyResolver
+ {
+ void Resolve(SourceCode module, string libraryName);
+ }
+}
\ No newline at end of file
diff --git a/src/OneScript.Core/Compilation/ICompilerBackend.cs b/src/OneScript.Core/Compilation/ICompilerBackend.cs
index 2904c8317..158210d98 100644
--- a/src/OneScript.Core/Compilation/ICompilerBackend.cs
+++ b/src/OneScript.Core/Compilation/ICompilerBackend.cs
@@ -10,7 +10,6 @@ This Source Code Form is subject to the terms of the
using OneScript.Compilation.Binding;
using OneScript.Execution;
using OneScript.Language.SyntaxAnalysis.AstNodes;
-using OneScript.Sources;
namespace OneScript.Compilation
{
diff --git a/src/OneScript.Core/Contexts/BslMethodBuilder.cs b/src/OneScript.Core/Contexts/BslMethodBuilder.cs
index 018c35f9e..818be5b59 100644
--- a/src/OneScript.Core/Contexts/BslMethodBuilder.cs
+++ b/src/OneScript.Core/Contexts/BslMethodBuilder.cs
@@ -76,7 +76,7 @@ public BslMethodBuilder IsExported(bool exportFlag)
return this;
}
- public BslMethodBuilder SetAnnotations(IEnumerable
+
+
+
diff --git a/src/VSCode.DebugAdapter/WebLaunchOptions.cs b/src/VSCode.DebugAdapter/WebLaunchOptions.cs
index 5c287305c..f53df4c5f 100644
--- a/src/VSCode.DebugAdapter/WebLaunchOptions.cs
+++ b/src/VSCode.DebugAdapter/WebLaunchOptions.cs
@@ -10,5 +10,7 @@ namespace VSCode.DebugAdapter
public class WebLaunchOptions : CommonLaunchOptions
{
public string AppDir { get; set; }
+
+ public bool WaitOnStart { get; set; }
}
}
\ No newline at end of file
diff --git a/src/VSCode.DebugAdapter/package.json b/src/VSCode.DebugAdapter/package.json
index 3df58bfa6..fb5098a29 100644
--- a/src/VSCode.DebugAdapter/package.json
+++ b/src/VSCode.DebugAdapter/package.json
@@ -1,7 +1,7 @@
{
"name": "oscript-debug",
"displayName": "OneScript Debug (BSL)",
- "version": "0.7.2",
+ "version": "0.8.0",
"publisher": "EvilBeaver",
"description": "Visual Studio Code debugger extension for OneScript (BSL)",
"icon": "images/logo-dbg.png",
@@ -131,7 +131,8 @@
"env": {},
"runtimeExecutable": null,
"runtimeArgs" : [],
- "debugPort": 2801
+ "debugPort": 2801,
+ "waitOnStart": false
}
],
"configurationAttributes": {
@@ -166,6 +167,11 @@
"type": "number",
"description": "Порт для запуска отладчика. Одновременные сеансы отладки должны быть разделены по портам",
"default": 2801
+ },
+ "waitOnStart": {
+ "type": "boolean",
+ "description": "Ожидать подключения отладчика при старте приложения (не выполнять bsl до его подключения)",
+ "default": false
}
}
},
diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs
index 193f10f42..4c1532c66 100644
--- a/src/oscript/CgiBehavior.cs
+++ b/src/oscript/CgiBehavior.cs
@@ -10,8 +10,8 @@ This Source Code Form is subject to the terms of the
using System.IO;
using System.Linq;
using System.Text;
-using OneScript.Commons;
using OneScript.Contexts;
+using OneScript.Exceptions;
using OneScript.StandardLibrary;
using oscript.Web;
diff --git a/src/oscript/DebugBehavior.cs b/src/oscript/DebugBehavior.cs
index dfd84dbd9..b76664f0f 100644
--- a/src/oscript/DebugBehavior.cs
+++ b/src/oscript/DebugBehavior.cs
@@ -5,6 +5,7 @@ This Source Code Form is subject to the terms of the
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using System;
+using OneScript.DebugProtocol;
using OneScript.DebugServices;
namespace oscript
@@ -20,6 +21,8 @@ public DebugBehavior(int port, string path, string[] args) : base(path, args)
public override int Execute()
{
+ Output.ConsoleOutputEncoding = DebuggerSettings.DebugModeEncoding;
+
var tcpDebugServer = new BinaryTcpDebugServer(_port);
DebugController = tcpDebugServer.CreateDebugController();
diff --git a/src/oscript/ExecuteScriptBehavior.cs b/src/oscript/ExecuteScriptBehavior.cs
index 12ee05a04..9e6069be2 100644
--- a/src/oscript/ExecuteScriptBehavior.cs
+++ b/src/oscript/ExecuteScriptBehavior.cs
@@ -1,105 +1,111 @@
-/*----------------------------------------------------------
-This Source Code Form is subject to the terms of the
-Mozilla Public License, v.2.0. If a copy of the MPL
-was not distributed with this file, You can obtain one
-at http://mozilla.org/MPL/2.0/.
-----------------------------------------------------------*/
-using System;
-using OneScript.StandardLibrary;
-using ScriptEngine;
-using ScriptEngine.HostedScript;
-using ScriptEngine.Hosting;
-using ScriptEngine.Machine;
-
-namespace oscript
-{
- class ExecuteScriptBehavior : AppBehavior, IHostApplication, ISystemLogWriter
- {
- protected string[] _scriptArgs;
- protected string _path;
-
- public ExecuteScriptBehavior(string path, string[] args)
- {
- _scriptArgs = args;
- _path = path;
- }
-
- public IDebugController DebugController { get; set; }
-
- public string CodeStatFile { get; set; }
-
- public bool CodeStatisticsEnabled => CodeStatFile != null;
-
- public override int Execute()
- {
- if (!System.IO.File.Exists(_path))
- {
- Echo($"Script file is not found '{_path}'");
- return 2;
- }
-
- SystemLogger.SetWriter(this);
-
- var builder = ConsoleHostBuilder.Create(_path);
- builder.WithDebugger(DebugController);
-
- var hostedScript = ConsoleHostBuilder.Build(builder);
-
- if (CodeStatisticsEnabled)
- hostedScript.EnableCodeStatistics();
-
- var source = hostedScript.Loader.FromFile(_path);
- Process process;
- try
- {
- process = hostedScript.CreateProcess(this, source);
- }
- catch (Exception e)
- {
- ShowExceptionInfo(e);
- return 1;
- }
-
- var result = process.Start();
- hostedScript.Dispose();
-
- if (CodeStatisticsEnabled)
- {
- var codeStat = hostedScript.GetCodeStatData();
- var statsWriter = new CodeStatWriter(CodeStatFile, CodeStatWriterType.JSON);
- statsWriter.Write(codeStat);
- }
-
- return result;
- }
-
- #region IHostApplication Members
-
- public void Echo(string text, MessageStatusEnum status = MessageStatusEnum.Ordinary)
- {
- ConsoleHostImpl.Echo(text, status);
- }
-
- public void ShowExceptionInfo(Exception exc)
- {
- ConsoleHostImpl.ShowExceptionInfo(exc);
- }
-
- public bool InputString(out string result, string prompt, int maxLen, bool multiline)
- {
- return ConsoleHostImpl.InputString(out result, prompt, maxLen, multiline);
- }
-
- public string[] GetCommandLineArguments()
- {
- return _scriptArgs;
- }
-
- #endregion
-
- public void Write(string text)
- {
- Console.Error.WriteLine(text);
- }
- }
-}
+/*----------------------------------------------------------
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v.2.0. If a copy of the MPL
+was not distributed with this file, You can obtain one
+at http://mozilla.org/MPL/2.0/.
+----------------------------------------------------------*/
+using System;
+using OneScript.StandardLibrary;
+using ScriptEngine;
+using ScriptEngine.HostedScript;
+using ScriptEngine.Hosting;
+using ScriptEngine.Machine;
+
+namespace oscript
+{
+ class ExecuteScriptBehavior : AppBehavior, IHostApplication, ISystemLogWriter
+ {
+ protected string[] _scriptArgs;
+ protected string _path;
+
+ public ExecuteScriptBehavior(string path, string[] args)
+ {
+ _scriptArgs = args;
+ _path = path;
+ }
+
+ public IDebugController DebugController { get; set; }
+
+ public string CodeStatFile { get; set; }
+
+ public bool CodeStatisticsEnabled => CodeStatFile != null;
+
+ public override int Execute()
+ {
+ if (!System.IO.File.Exists(_path))
+ {
+ Echo($"Script file is not found '{_path}'");
+ return 2;
+ }
+
+ SystemLogger.SetWriter(this);
+
+ var builder = ConsoleHostBuilder.Create(_path);
+ builder.WithDebugger(DebugController);
+ CodeStatProcessor codeStatProcessor = null;
+ if (CodeStatisticsEnabled)
+ {
+ codeStatProcessor = new CodeStatProcessor();
+ builder.Services.RegisterSingleton(codeStatProcessor);
+ }
+
+ var hostedScript = ConsoleHostBuilder.Build(builder);
+
+
+
+ var source = hostedScript.Loader.FromFile(_path);
+ Process process;
+ try
+ {
+ process = hostedScript.CreateProcess(this, source);
+ }
+ catch (Exception e)
+ {
+ ShowExceptionInfo(e);
+ return 1;
+ }
+
+ var result = process.Start();
+ hostedScript.Dispose();
+
+ if (codeStatProcessor != null)
+ {
+ codeStatProcessor.EndCodeStat();
+ var codeStat = codeStatProcessor.GetStatData();
+ var statsWriter = new CodeStatWriter(CodeStatFile, CodeStatWriterType.JSON);
+ statsWriter.Write(codeStat);
+ }
+
+ return result;
+ }
+
+ #region IHostApplication Members
+
+ public void Echo(string text, MessageStatusEnum status = MessageStatusEnum.Ordinary)
+ {
+ ConsoleHostImpl.Echo(text, status);
+ }
+
+ public void ShowExceptionInfo(Exception exc)
+ {
+ ConsoleHostImpl.ShowExceptionInfo(exc);
+ }
+
+ public bool InputString(out string result, string prompt, int maxLen, bool multiline)
+ {
+ return ConsoleHostImpl.InputString(out result, prompt, maxLen, multiline);
+ }
+
+ public string[] GetCommandLineArguments()
+ {
+ return _scriptArgs;
+ }
+
+ #endregion
+
+ public void Write(string text)
+ {
+ Console.Error.WriteLine(text);
+ }
+ }
+}
diff --git a/src/oscript/ShowUsageBehavior.cs b/src/oscript/ShowUsageBehavior.cs
index c24e0c830..5b5baba3a 100644
--- a/src/oscript/ShowUsageBehavior.cs
+++ b/src/oscript/ShowUsageBehavior.cs
@@ -1,39 +1,37 @@
-/*----------------------------------------------------------
-This Source Code Form is subject to the terms of the
-Mozilla Public License, v.2.0. If a copy of the MPL
-was not distributed with this file, You can obtain one
-at http://mozilla.org/MPL/2.0/.
-----------------------------------------------------------*/
-
-using System.Reflection;
-
-namespace oscript
-{
- internal class ShowUsageBehavior : AppBehavior
- {
- public override int Execute()
- {
- Output.WriteLine($"1Script Execution Engine. Version {Program.GetVersion()}");
- Output.WriteLine();
- Output.WriteLine("Usage:");
- Output.WriteLine();
- Output.WriteLine("I. Script execution: oscript.exe [script arguments..]");
- Output.WriteLine();
- Output.WriteLine("II. Special mode: oscript.exe [script arguments..]");
- Output.WriteLine("Mode can be one of these:");
- Output.WriteLine($" {"-measure",-12}measures execution time");
- Output.WriteLine($" {"-compile",-12}shows compiled module without execution");
- Output.WriteLine($" {"-check [-env=]",-12}provides syntax check");
- Output.WriteLine($" {"-check -cgi",-12}provides syntax check in CGI-mode");
- Output.WriteLine($" {"-version",-12}output version string");
- Output.WriteLine();
- Output.WriteLine(" -encoding= set output encoding");
- Output.WriteLine(" -codestat= write code statistics");
- Output.WriteLine();
- Output.WriteLine("III. Run as CGI application: oscript.exe -cgi [script arguments..]");
- Output.WriteLine(" Runs as CGI application under HTTP-server (Apache/Nginx/IIS/etc...)");
-
- return 0;
- }
- }
+/*----------------------------------------------------------
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v.2.0. If a copy of the MPL
+was not distributed with this file, You can obtain one
+at http://mozilla.org/MPL/2.0/.
+----------------------------------------------------------*/
+
+namespace oscript
+{
+ internal class ShowUsageBehavior : AppBehavior
+ {
+ public override int Execute()
+ {
+ Output.WriteLine($"1Script Execution Engine. Version {Program.GetVersion()}");
+ Output.WriteLine();
+ Output.WriteLine("Usage:");
+ Output.WriteLine();
+ Output.WriteLine("I. Script execution: oscript.exe [script arguments..]");
+ Output.WriteLine();
+ Output.WriteLine("II. Special mode: oscript.exe [script arguments..]");
+ Output.WriteLine("Mode can be one of these:");
+ Output.WriteLine($" {"-measure",-12}measures execution time");
+ Output.WriteLine($" {"-compile",-12}shows compiled module without execution");
+ Output.WriteLine($" {"-check [-env=]",-12}provides syntax check");
+ Output.WriteLine($" {"-check -cgi",-12}provides syntax check in CGI-mode");
+ Output.WriteLine($" {"-version",-12}output version string");
+ Output.WriteLine();
+ Output.WriteLine(" -encoding= set output encoding");
+ Output.WriteLine(" -codestat= write code statistics");
+ Output.WriteLine();
+ Output.WriteLine("III. Run as CGI application: oscript.exe -cgi [script arguments..]");
+ Output.WriteLine(" Runs as CGI application under HTTP-server (Apache/Nginx/IIS/etc...)");
+
+ return 0;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/oscript/ShowVersionBehavior.cs b/src/oscript/ShowVersionBehavior.cs
index 02ef0119f..bdb13a095 100644
--- a/src/oscript/ShowVersionBehavior.cs
+++ b/src/oscript/ShowVersionBehavior.cs
@@ -1,20 +1,18 @@
-/*----------------------------------------------------------
-This Source Code Form is subject to the terms of the
-Mozilla Public License, v.2.0. If a copy of the MPL
-was not distributed with this file, You can obtain one
-at http://mozilla.org/MPL/2.0/.
-----------------------------------------------------------*/
-
-using System.Reflection;
-
-namespace oscript
-{
- internal class ShowVersionBehavior : AppBehavior
- {
- public override int Execute()
- {
- Output.WriteLine(Program.GetVersion());
- return 0;
- }
- }
+/*----------------------------------------------------------
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v.2.0. If a copy of the MPL
+was not distributed with this file, You can obtain one
+at http://mozilla.org/MPL/2.0/.
+----------------------------------------------------------*/
+
+namespace oscript
+{
+ internal class ShowVersionBehavior : AppBehavior
+ {
+ public override int Execute()
+ {
+ Output.WriteLine(Program.GetVersion());
+ return 0;
+ }
+ }
}
\ No newline at end of file
diff --git a/tests/engine-behaviors.os b/tests/engine-behaviors.os
index e2a2b1f45..01867ddf2 100644
--- a/tests/engine-behaviors.os
+++ b/tests/engine-behaviors.os
@@ -50,6 +50,8 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьПрерываниеВложенныхПопыток");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПродолжениеВложенныхПопыток");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИнформацияОбОшибкеВнеИсключения");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоСсылке");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьСравнениеНаБольшеМеньше");
Возврат ВсеТесты;
@@ -241,7 +243,7 @@
Попытка
ПроброситьИсключение();
Исключение
- юТест.ПроверитьИстину(ПустаяСтрока(ИнформацияОбОшибке().Описание), "Текст исключения должен быть пустым");
+ юТест.ПроверитьРавенство("", ИнформацияОбОшибке().Описание, "Текст исключения должен быть пустым");
КонецПопытки;
КонецПроцедуры
@@ -466,7 +468,7 @@
юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию");
-
+
П = ПропущенныеПараметры1(,,);
юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию");
@@ -478,25 +480,25 @@
юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П2, 2, "Параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию");
-
+
П = ПропущенныеПараметры1(3,);
юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию");
-
+
П = ПропущенныеПараметры1(3,,);
юТест.ПроверитьРавенство(П.П1, 3, "Параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П3, "1", "Пропущенный параметр со значением по-умолчанию");
-
+
П = ПропущенныеПараметры1(,,"4");
юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П2, Неопределено, "Пропущенный параметр без значения по-умолчанию");
юТест.ПроверитьРавенство(П.П3, "4", "Параметр со значением по-умолчанию");
-
+
П = ПропущенныеПараметры1(, 2, "6");
юТест.ПроверитьРавенство(П.П1, Неопределено, "Пропущенный параметр без значения по-умолчанию");
@@ -627,4 +629,65 @@
юТест.ПроверитьРавенство("", ИнформацияОбОшибке.ПодробноеОписаниеОшибки());
юТест.ПроверитьРавенство(Неопределено, ИнформацияОбОшибке.Параметры);
-КонецПроцедуры
\ No newline at end of file
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьПередачуПараметровПоСсылке() Экспорт
+
+ Структура = Новый Структура("Поле", 1);
+
+ Т = 0;
+ Рез = Структура.Свойство("Поле", Т);
+ юТест.ПроверитьРавенство(1, Т, "Для переменной");
+
+ Массив = Новый Массив(1);
+ Рез = Структура.Свойство("Поле", Массив[0]);
+ юТест.ПроверитьРавенство(1, Массив[0], "Для элемента массива");
+
+ Структура2 = Новый Структура("Поле", 2);
+ Рез = Структура.Свойство("Поле", Структура2.Поле);
+ юТест.ПроверитьРавенство(1, Структура2.Поле, "Для поля структуры");
+
+ Рез = Структура.Свойство("Поле", 3); // не должно упасть
+ юТест.ПроверитьРавенство(истина, Рез);
+
+ Рез = Структура.Свойство("Поле", ТекущаяДата()); // не должно упасть
+ юТест.ПроверитьРавенство(истина, Рез);
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьСравнениеНаБольшеМеньше() Экспорт
+
+ Ошибка = "Сравнение на больше/меньше для данного типа не поддерживается";
+
+ юТест.ПроверитьКодСОшибкой(
+ "Рез = (СтатусСообщения.БезСтатуса <= СтатусСообщения.БезСтатуса);",
+ Ошибка, "Для одинаковых значений перечислений" );
+
+ юТест.ПроверитьКодСОшибкой(
+ "Рез = (ЦветКонсоли.Черный < СтатусСообщения.БезСтатуса);",
+ Ошибка, "Для значений перечислений разных типов" );
+
+ юТест.ПроверитьКодСОшибкой(
+ "Рез = (КодировкаТекста >= КодировкаТекста);",
+ Ошибка, "Для одинаковых перечислений" );
+ юТест.ПроверитьКодСОшибкой(
+ "Рез = (ХешФункция > СтатусСообщения);",
+ Ошибка, "Для перечислений разных типов" );
+
+ юТест.ПроверитьКодСОшибкой(
+ "Рез = (ТипЗнч(истина) > ТипЗнч(0));",
+ Ошибка, "Для значений типа 'Тип'" );
+
+ юТест.ПроверитьКодСОшибкой(
+ "Массив = Новый Массив(1);
+ |Структура = Новый Структура;
+ |Рез = (Массив > Структура);",
+ Ошибка, "Для объектов разных типов" );
+
+ юТест.ПроверитьКодСОшибкой(
+ "Массив = Новый Массив(1);
+ |Массив2 = Новый Массив(1);;
+ |Рез = (Массив <= Массив2);",
+ Ошибка, "Для одинаковых объектов" );
+
+КонецПроцедуры
diff --git a/tests/native-compiler.os b/tests/eratosthenes.os
similarity index 100%
rename from tests/native-compiler.os
rename to tests/eratosthenes.os
diff --git a/tests/eval.os b/tests/eval.os
index d6f31fba6..3344fe294 100644
--- a/tests/eval.os
+++ b/tests/eval.os
@@ -1,4 +1,5 @@
Перем юТест;
+Перем Глобал;
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
@@ -15,7 +16,15 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВОператореВыполнитьЗапрещенВозврат");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойствоЭтотОбъект_issue712");
ВсеТесты.Добавить("ТестДолжен_ПроверитьКешКомпиляцииВРазныхФреймах");
-
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьРекурсивныйВызовВычислить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьСложныеВложенныеВызовыВычислить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьВычислитьВнутриВыполнить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьАлиасыФункцийИПеременныхВВычислить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьОбработкуИсключенияВВыполнить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьРекурсивныйВызовВыполнить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенныеВызовыВыполнить");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовыВыполнитьСПопытками");
+
Возврат ВсеТесты;
КонецФункции
@@ -168,3 +177,147 @@
юТест.ПроверитьРавенство(3, Рез4);
КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьРекурсивныйВызовВычислить() Экспорт
+ Рез = "Вычислить(1)";
+ Для й=1 По 100 Цикл
+ Рез = "Вычислить("+Рез+")+1";
+ КонецЦикла;
+
+ Рез = Вычислить(Рез);
+ юТест.ПроверитьРавенство(101, Рез);
+КонецПроцедуры
+
+
+Функция Один()
+ Возврат Вычислить("1");
+КонецФункции
+
+Функция Два()
+ Один = Вычислить("Один()");
+ Возврат Вычислить("Один+Один()");
+КонецФункции
+
+Функция Шесть()
+ Три = 3;
+ Возврат Вычислить("Два()") * Три;
+КонецФункции
+
+Функция СорокДва(Семь)
+ Возврат Вычислить("Семь * Шесть()");
+КонецФункции
+
+Функция Ответ()
+ Возврат Вычислить("Глобал + СорокДва(7)");
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьСложныеВложенныеВызовыВычислить() Экспорт
+ Глобал = 0;
+ Рез = Вычислить("Ответ()");
+ юТест.ПроверитьРавенство(42, Рез);
+
+ Глобал = 66;
+ Рез = Вычислить("Ответ()");
+ юТест.ПроверитьРавенство(108, Рез);
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВычислитьВнутриВыполнить() Экспорт
+ Рез = -1;
+ Выполнить("Для й=1 По 9 Цикл ц = -й; КонецЦикла; Рез = Вычислить(""ц + й"")");
+ юТест.ПроверитьРавенство(1, Рез);
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьАлиасыФункцийИПеременныхвВычислить() Экспорт
+ Рез = Вычислить("Лев(""фыв""+Символы.ПС,1)+Left(""fgh""+Chars.LF,1)");
+ юТест.ПроверитьРавенство("фf", Рез);
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьОбработкуИсключенияВВыполнить() Экспорт
+
+ Рез = 1;
+ Выполнить "
+ |Попытка
+ | Рез = 1/0;
+ |Исключение
+ | Рез = -1;
+ |КонецПопытки;";
+ юТест.ПроверитьРавенство(-1, Рез);
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьРекурсивныйВызовВыполнить() Экспорт
+
+ Рез = 1;
+ Код = "Рез=Рез+1;";
+ Для й = 1 По 10 Цикл
+ Код = СтрЗаменить(Код, """", """""");
+ Код = "Выполнить""" + Код + """;";
+ КонецЦикла;
+ Выполнить(Код);
+
+ юТест.ПроверитьРавенство(2, Рез);
+
+КонецПроцедуры
+
+Процедура Третья(Пар)
+ Выполнить "Рез = Рез + Пар;";
+КонецПроцедуры
+
+Процедура Вторая(Пар)
+ Выполнить "Лок = Пар + 1; Третья(Лок);";
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВложенныеВызовыВыполнить() Экспорт
+
+ Рез = 1;
+ Выполнить "Вторая(2);";
+
+ юТест.ПроверитьРавенство(4, Рез);
+
+КонецПроцедуры
+
+Процедура СИсключением()
+ Выполнить "
+ |Попытка
+ | Рез = Рез + 8;
+ | ВызватьИсключение 0;
+ |Исключение
+ | Рез = Рез + 9;
+ |КонецПопытки;
+ |Выполнить(""Рез = Рез + (-10)"");";
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВызовыВыполнитьСПопытками() Экспорт
+
+ Рез = "0";
+ попытка
+ Выполнить("
+ |Лок=""1"";
+ |Попытка
+ | Рез = 1/0;
+ |Исключение
+ | Рез = Рез + Лок;
+ |КонецПопытки;");
+ Выполнить("
+ |Попытка
+ | Рез = Рез + 2/0;
+ |Исключение
+ | Выполнить(""Рез = Рез + 3"");
+ |КонецПопытки;
+ |Рез = Рез + 4;");
+ Выполнить("
+ |Попытка
+ | Рез = Рез + 5;
+ | СИсключением();
+ |Исключение
+ | Рез = Рез + 6;
+ |КонецПопытки;
+ |Рез = Рез + 7;");
+ исключение
+ Рез = Рез+ "!" ;
+ конецпопытки;
+ Рез = Рез + "+";
+
+ юТест.ПроверитьРавенство("0134589-107+", Рез);
+
+КонецПроцедуры
diff --git a/tests/global-funcs.os b/tests/global-funcs.os
index 9bce86e3c..50d9d4d37 100644
--- a/tests/global-funcs.os
+++ b/tests/global-funcs.os
@@ -43,6 +43,15 @@
ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаДвоичныеДанные");
ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаСтрокаИзПеременной");
ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеДвоичныеДанные");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаNULL");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаGUID");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаПеречисления");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLСтрокаНедопустимыеТипы");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеNULL");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеGUID");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеПеречисления");
+ ВсеТесты.Добавить("ТестДолжен_Проверить_XMLЗначениеНедопустимыеТипы");
+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗаписьВBase64");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтениеИзBase64");
@@ -374,6 +383,122 @@
КонецПроцедуры
+Процедура ТестДолжен_Проверить_XMLСтрокаNULL() Экспорт
+
+ юТест.ПроверитьРавенство("", XMLСтрока(NULL));
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLЗначениеNULL() Экспорт
+
+ Тип = Тип("NULL");
+
+ Значение = XMLЗначение(Тип, " ");
+ юТест.ПроверитьТип(Значение, Тип);
+
+ БылоИсключение = Ложь;
+ Попытка
+ Значение = XMLЗначение(Тип, "NULL");
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом представлении NULL в XMLЗначение");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLСтрокаGUID() Экспорт
+
+ Строка = "ae1d6d78-c3d5-4ef0-b096-2fb4f8e4717e";
+ GUID = Новый УникальныйИдентификатор(Строка);
+ юТест.ПроверитьРавенство(Строка, XMLСтрока(GUID));
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLЗначениеGUID() Экспорт
+
+ Тип = Тип("УникальныйИдентификатор");
+ Строка = "ae1d6d78-c3d5-4ef0-b096-2fb4f8e4717e";
+
+ Значение = XMLЗначение(Тип, Строка);
+ юТест.ПроверитьТип(Значение, Тип);
+ юТест.ПроверитьРавенство(Строка(Значение), Строка);
+
+ БылоИсключение = Ложь;
+ Попытка
+ Значение = XMLЗначение(Тип, "-a-e1d6d78c3d54ef0b0962fb4f8e4717e");
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом представлении GUID в XMLЗначение");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLСтрокаПеречисления() Экспорт
+
+ Перечисление = ДопустимыйЗнак.Неотрицательный;
+ юТест.ПроверитьРавенство("Неотрицательный", XMLСтрока(Перечисление)); // нужно "Nonnegative"
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLЗначениеПеречисления() Экспорт
+ Тип = Тип("ДопустимаяДлина");
+ Значение = XMLЗначение(Тип, "Fixed");
+
+ юТест.ПроверитьТип(Значение, Тип);
+ юТест.ПроверитьРавенство(Значение, ДопустимаяДлина.Фиксированная);
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLСтрокаНедопустимыеТипы() Экспорт
+
+ Массив = Новый Массив(1);
+ БылоИсключение = Ложь;
+ Попытка
+ Стр = XMLСтрока(Массив);
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом типе в XMLСтрока");
+
+ Перечисление = НаправлениеСортировки.Возр;
+ БылоИсключение = Ложь;
+ Попытка
+ Стр = XMLСтрока(Перечисление);
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом перечислении в XMLСтрока");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Проверить_XMLЗначениеНедопустимыеТипы() Экспорт
+
+ БылоИсключение = Ложь;
+ Попытка
+ Значение = XMLЗначение(Тип("НаправлениеСортировки"), "Возр");
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом типе в XMLСтрока");
+
+ Перечисление = НаправлениеСортировки.Возр;
+ БылоИсключение = Ложь;
+ Попытка
+ Значение = XMLЗначение(Тип("ДопустимаяДлина"), "Возр");
+ Исключение
+ БылоИсключение = Истина;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(БылоИсключение,"Не было исключения при недопустимом значении в XMLСтрока");
+
+КонецПроцедуры
+
+
Функция ПрочитатьФайлСкрипта(Знач Файл)
Ч = Новый ЧтениеТекста(Файл);
diff --git a/tests/managed-com.os b/tests/managed-com.os
index e92d6d6bc..8cf6bd4db 100644
--- a/tests/managed-com.os
+++ b/tests/managed-com.os
@@ -14,6 +14,7 @@
Если (Найти(СИ.ВерсияОС, "Windows") > 0) И Не (ПеременныеСреды().Получить("APPVEYOR") = "True") Тогда
ВсеТесты.Добавить("ТестДолжен_ПроверитьУстановкуЧисловыхСвойств");
ВсеТесты.Добавить("ТестДолжен_ПроверитьВызовСОпциональнымиПараметрами");
+ ВсеТесты.Добавить("ПроверитьВыходныеПараметрыComОбъекта");
КонецЕсли;
ВсеТесты.Добавить("ТестДолжен_ПроверитьСозданиеClrОбъекта");
@@ -24,7 +25,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляЭлементовСписка");
ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуGetTypeДляCLRКоллекции");
ВсеТесты.Добавить("ТестДолжен_ПроверитьРаботуТипаНеИзЯдра");
-
+
Возврат ВсеТесты;
КонецФункции
@@ -176,3 +177,16 @@
ПроверитьРаботуGetTypeДляОдногоТипа(Ури, "System", "Uri");
КонецПроцедуры
+
+Процедура ПроверитьВыходныеПараметрыComОбъекта() Экспорт
+ // Проверяем, что выходной параметр установился, а также то, что попытки записи во входной параметр не было.
+
+ Рег = Новый ФиксированнаяСтруктура("HKEY_LOCAL_MACHINE", "2147483650");
+ ИмяФайлаКласса = "";
+ РеестрОС = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
+ Рез=РеестрОС.GetStringValue(Рег.HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion","DevicePath", ИмяФайлаКласса);
+
+ юТест.ПроверитьРавенство(0, Рез);
+ юТест.ПроверитьНеравенство("", ИмяФайлаКласса);
+
+КонецПроцедуры
diff --git a/tests/native-api/build.sh b/tests/native-api/build.sh
old mode 100644
new mode 100755
index 4a911d356..a2aaacc80
--- a/tests/native-api/build.sh
+++ b/tests/native-api/build.sh
@@ -11,5 +11,6 @@ cmake -E make_directory build64
cd build64
cmake -D CMAKE_BUILD_TYPE:STRING=Release -D TARGET_PLATFORM_32:BOOL=OFF --build ..
cmake --build .
+chmod +x *.so
cp *.so ..
cd ..
diff --git a/tests/native-lib/test-import-native-from-stack.os b/tests/native-lib/test-import-native-from-stack.os
new file mode 100644
index 000000000..9722dba00
--- /dev/null
+++ b/tests/native-lib/test-import-native-from-stack.os
@@ -0,0 +1,36 @@
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ПроверитьОберткуНадРегуляркой");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьОберткуНадРегуляркой() Экспорт
+ ИсходнаяСтрока = "{20221110000049,N,
+ |{2444a6a24da10,3d},1,1,1,1803214,81,I,""Первое событие"",599,
+ |{""U""},""Представление данных"",1,1,9,3,0,
+ |{0}
+ |},
+ |{20221110000049,U,
+ |{2444a6a24da10,3d},1,1,1,1803214,81,E,""Второе событие"",599,
+ |{""U""},""Представление данных2"",1,1,9,3,0,
+ |{2,1,31,2,31}
+ |}";
+ Регулярка = "\,*\r*\n*\{(\d{14}),(\w),\r*\n\{([0-9a-f]+),([0-9a-f]+)\},(\d+),(\d+),(\d+),(\d+),(\d+),(\w),""([^ꡏ]*?)(?="",\d+,\r*\n)"",(\d+),\r*\n\{([^ꡏ]*?)(?=\},"")\},""([^ꡏ]*?)(?="",\d+)"",(\d+),(\d+),(\d+),(\d+),\d+[,\d+]*,\r*\n\{((\d+)|\d+,(\d+),(\d+),(\d+),(\d+))\}\r*\n\},*\r*\n*";
+
+ ОберткаНадРегуляркой = Новый ОберткаНадРегуляркой(Регулярка);
+
+ Совпадения = ОберткаНадРегуляркой.НайтиСовпадения(ИсходнаяСтрока);
+ Совпадение = Совпадения[0];
+
+ юТест.ПроверитьРавенство(2, Совпадения.Количество());
+КонецПроцедуры
+
diff --git a/tests/native-lib/test-native-change-array.os b/tests/native-lib/test-native-change-array.os
new file mode 100644
index 000000000..9c9845f58
--- /dev/null
+++ b/tests/native-lib/test-native-change-array.os
@@ -0,0 +1,30 @@
+#native
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ИзменениеМассиваПоСсылке");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ИзменениеМассиваПоСсылке() Экспорт
+
+ МойМассив = Новый Массив;
+
+ ДобавитьВМассив(МойМассив);
+
+ Значение = МойМассив[0];
+
+ юТест.ПроверитьРавенство(Значение, 1, "Массив изменен корректно");
+
+КонецПроцедуры
+
+Процедура ДобавитьВМассив(Массив)
+ Массив.Добавить(1);
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-default-params-in-methods.os b/tests/native-lib/test-native-default-params-in-methods.os
new file mode 100644
index 000000000..aafbc6153
--- /dev/null
+++ b/tests/native-lib/test-native-default-params-in-methods.os
@@ -0,0 +1,74 @@
+#native
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюСтрока");
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюБулево");
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюНеопределено");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюСтрока() Экспорт
+
+ Результат = МетодСтроки(,"Текст");
+
+ юТест.ПроверитьРавенство(Результат, "Т1 Текст", "Текст сформирован корректно");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюБулево() Экспорт
+
+ Результат1 = МетодБулево();
+ Результат2 = МетодБулево(Истина);
+ Результат3 = МетодБулево(Ложь);
+
+ юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюНеопределено() Экспорт
+
+ Результат1 = МетодНеопределено();
+ Результат2 = МетодНеопределено(Неопределено);
+ Результат3 = МетодНеопределено(Ложь);
+
+ юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно");
+
+КонецПроцедуры
+
+Функция МетодСтроки(Текст1 = "Т1 ", Текст2 = "Т2 ")
+ Сообщить(Текст1);
+ Сообщить(Текст2);
+ Возврат Текст1 + Текст2;
+КонецФункции
+
+Функция МетодБулево(Булево = Истина)
+
+ Если Булево = Истина Или Булево Тогда
+ Возврат 1;
+ Иначе
+ Возврат 0;
+ КонецЕсли;
+
+КонецФункции
+
+Функция МетодНеопределено(Параметр = Неопределено)
+
+ Если Параметр = Неопределено Тогда
+ Возврат 1;
+ Иначе
+ Возврат 0;
+ КонецЕсли;
+
+КонецФункции
\ No newline at end of file
diff --git a/tests/native-lib/test-native-kolichestvo.os b/tests/native-lib/test-native-kolichestvo.os
new file mode 100644
index 000000000..2fa09ba8a
--- /dev/null
+++ b/tests/native-lib/test-native-kolichestvo.os
@@ -0,0 +1,91 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Массив");
+ Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Структура");
+ Тесты.Добавить("ТестДолжен_ПроверитьКоличество_СписокЗначений");
+ Тесты.Добавить("ТестДолжен_ПроверитьКоличество_Соответствие");
+ Тесты.Добавить("ТестДолжен_ПроверитьКоличество_ТаблицаЗначений");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьКоличество_Массив() Экспорт
+
+ // Дано
+ Коллекция = Новый Массив();
+
+ // Когда
+ Количество = Коллекция.Количество();
+
+ // Тогда
+
+ юТест.ПроверитьРавенство(Количество, 0, "Количество получено");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьКоличество_Структура() Экспорт
+
+ // Дано
+ Коллекция = Новый Структура();
+
+ // Когда
+ Количество = Коллекция.Количество();
+
+ // Тогда
+
+ юТест.ПроверитьРавенство(Количество, 0, "Количество получено");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьКоличество_СписокЗначений() Экспорт
+
+ // Дано
+ Коллекция = Новый СписокЗначений();
+
+ // Когда
+ Количество = Коллекция.Количество();
+
+ // Тогда
+
+ юТест.ПроверитьРавенство(Количество, 0, "Количество получено");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьКоличество_Соответствие() Экспорт
+
+ // Дано
+ Коллекция = Новый Соответствие();
+
+ // Когда
+ Количество = Коллекция.Количество();
+
+ // Тогда
+
+ юТест.ПроверитьРавенство(Количество, 0, "Количество получено");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьКоличество_ТаблицаЗначений() Экспорт
+
+ // Дано
+ Коллекция = Новый ТаблицаЗначений();
+
+ // Когда
+ Количество = Коллекция.Количество();
+ КоличествоКолонок = Коллекция.Колонки.Количество();
+
+ // Тогда
+
+ юТест.ПроверитьРавенство(Количество, 0, "Количество получено");
+ юТест.ПроверитьРавенство(КоличествоКолонок, 0, "Количество получено");
+
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-search-in-array.os b/tests/native-lib/test-native-search-in-array.os
new file mode 100644
index 000000000..d3a2e1f33
--- /dev/null
+++ b/tests/native-lib/test-native-search-in-array.os
@@ -0,0 +1,40 @@
+#native
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ПроверитьПоискВМассиве");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьПоискВМассиве() Экспорт
+
+ Массив = Новый Массив();
+ Массив.Добавить("1");
+ Массив.Добавить("2");
+ Массив.Добавить("3");
+
+ Если Массив.Найти("1") <> Неопределено Тогда
+ НашлиЗначение1 = Истина;
+ Иначе
+ НашлиЗначение1 = Ложь;
+ КонецЕсли;
+
+ Если Массив.Найти("9") <> Неопределено Тогда
+ НашлиЗначение9 = Истина;
+ Иначе
+ НашлиЗначение9 = Ложь;
+ КонецЕсли;
+
+ юТест.ПроверитьРавенство(НашлиЗначение1, Истина, "Нашли 1");
+ юТест.ПроверитьРавенство(НашлиЗначение9, Ложь, "Не нашли 9");
+ юТест.ПроверитьРавенство(Массив.Найти("2"), 1, "Индекс элемента по значению");
+
+КонецПроцедуры
+
diff --git a/tests/native-lib/test-native-use-default-params-bool.os b/tests/native-lib/test-native-use-default-params-bool.os
new file mode 100644
index 000000000..526a080de
--- /dev/null
+++ b/tests/native-lib/test-native-use-default-params-bool.os
@@ -0,0 +1,29 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьБулево");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьБулево() Экспорт
+
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ Результат1 = Сценарий.МетодБулево();
+ Результат2 = Сценарий.МетодБулево(Истина);
+ Результат3 = Сценарий.МетодБулево(Ложь);
+
+ юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно");
+
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-use-default-params-string.os b/tests/native-lib/test-native-use-default-params-string.os
new file mode 100644
index 000000000..ae5102c99
--- /dev/null
+++ b/tests/native-lib/test-native-use-default-params-string.os
@@ -0,0 +1,25 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьСтрока");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьСтрока() Экспорт
+
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ Результат = Сценарий.МетодСтроки(,"Текст");
+
+ юТест.ПроверитьРавенство(Результат, "Т1 Текст", "Текст сформирован корректно");
+
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-use-default-params-undefinde.os b/tests/native-lib/test-native-use-default-params-undefinde.os
new file mode 100644
index 000000000..d0ce0e2aa
--- /dev/null
+++ b/tests/native-lib/test-native-use-default-params-undefinde.os
@@ -0,0 +1,29 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьНеопределено");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ЗначенияВМетодахПоУмолчаниюИспользоватьНеопределено() Экспорт
+
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ Результат1 = Сценарий.МетодНеопределено();
+ Результат2 = Сценарий.МетодНеопределено(Неопределено);
+ Результат3 = Сценарий.МетодНеопределено(Ложь);
+
+ юТест.ПроверитьРавенство(Результат1, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат2, 1, "параметр передан корректно");
+ юТест.ПроверитьРавенство(Результат3, 0, "параметр передан корректно");
+
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-use-params-in-constructor.os b/tests/native-lib/test-native-use-params-in-constructor.os
new file mode 100644
index 000000000..dce112f4f
--- /dev/null
+++ b/tests/native-lib/test-native-use-params-in-constructor.os
@@ -0,0 +1,23 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ПроверитьПередачуЗначенияВКонструктор");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьПередачуЗначенияВКонструктор() Экспорт
+
+ НужныйОбъект = Новый СценарийСТекстомВКонструкторе("1");
+
+ юТест.ПроверитьРавенство(НужныйОбъект.Поле1, "1", "параметр передан корректно");
+
+КонецПроцедуры
diff --git a/tests/native-lib/test-native-use.os b/tests/native-lib/test-native-use.os
new file mode 100644
index 000000000..26e561fe4
--- /dev/null
+++ b/tests/native-lib/test-native-use.os
@@ -0,0 +1,89 @@
+#native
+#Использовать "."
+
+Перем юТест;
+
+Функция ПолучитьСписокТестов(Тестирование) Экспорт
+
+ юТест = Тестирование;
+
+ Тесты = Новый Массив;
+ Тесты.Добавить("ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса");
+ Тесты.Добавить("ТестДолжен_ПроверитьПодключениеСценария");
+ Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию");
+ Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСПропущеннымиПараметрами");
+ Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами");
+ Тесты.Добавить("ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами");
+
+ Возврат Тесты;
+
+КонецФункции
+
+Процедура ТестДолжен_ПроверитьСозданиеОбъекта_ИзНативногоКласса() Экспорт
+ ТестовыйСценарий = Новый ТестовыйСценарий;
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьПодключениеСценария() Экспорт
+ ПодключитьСценарий(ОбъединитьПути(ТекущийСценарий().Каталог, "Классы", "ТестовыйСценарий.os"), "ПодключенныйСценарий");
+
+ ТестовыйСценарий = Новый ПодключенныйСценарий;
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВызовМетодовСПараметрамиПоУмолчанию() Экспорт
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ Результат1 = Сценарий.МетодБулево();
+ Результат2 = Сценарий.МетодБулево(Истина);
+ Результат3 = Сценарий.МетодБулево(Ложь);
+
+ Если НЕ Результат1 = 1 Тогда
+ ВызватьИсключение "Ошибка передачи параметра";
+ КонецЕсли;
+
+ Если НЕ Результат2 = 1 Тогда
+ ВызватьИсключение "Ошибка передачи параметра";
+ КонецЕсли;
+
+ Если НЕ Результат3 = 0 Тогда
+ ВызватьИсключение "Ошибка передачи параметра";
+ КонецЕсли;
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВызовМетодовСПропущеннымиПараметрами() Экспорт
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ Результат = Сценарий.МетодЧисло(,2);
+
+ юТест.ПроверитьРавенство(Результат, 1, "Ошибка передачи пропущенного параметра");
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВызовМетодовСОшибочноПропущеннымиПараметрами() Экспорт
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ ОК = Ложь;
+ Ошибка = "";
+ Попытка
+ Результат = Сценарий.МетодЧисло(1,);
+ Исключение
+ Ошибка = ИнформацияОбОшибке().Описание;
+ ОК = СтрНайти(Ошибка,"Пропущен") > 0;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(ОК, "Не было исключения о пропущенном параметре."+Ошибка);
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьВызовМетодовСЛишнимиПараметрами() Экспорт
+ Сценарий = Новый ПараметрыПоУмолчанию;
+
+ ОК = Ложь;
+ Ошибка = "";
+ Попытка
+ Результат = Сценарий.МетодЧисло(1,2,3);
+ Исключение
+ Ошибка = ИнформацияОбОшибке().Описание;
+ ОК = СтрНайти(Ошибка,"Слишком много") > 0;
+ КонецПопытки;
+
+ юТест.ПроверитьИстину(ОК, "Не было исключения о лишнем параметре."+Ошибка);
+КонецПроцедуры
\ No newline at end of file
diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os"
new file mode 100644
index 000000000..fb82ecfa0
--- /dev/null
+++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\320\265\321\200\321\202\320\272\320\260\320\235\320\260\320\264\320\240\320\265\320\263\321\203\320\273\321\217\321\200\320\272\320\276\320\271.os"
@@ -0,0 +1,15 @@
+#native
+
+Перем РегулярноеВыражение;
+
+Процедура ПриСозданииОбъекта(ТекстРегулярки)
+ РегулярноеВыражение = Новый РегулярноеВыражение(ТекстРегулярки);
+КонецПроцедуры
+
+Функция НайтиСовпадения(Текст) Экспорт
+
+ КоллекцияСовпадений = РегулярноеВыражение.НайтиСовпадения(Текст);
+
+ Возврат КоллекцияСовпадений;
+
+КонецФункции
\ No newline at end of file
diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os"
new file mode 100644
index 000000000..b943f980f
--- /dev/null
+++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\320\276\320\243\320\274\320\276\320\273\321\207\320\260\320\275\320\270\321\216.os"
@@ -0,0 +1,39 @@
+#native
+
+Процедура ПриСозданииОбъекта()
+
+КонецПроцедуры
+
+Функция МетодСтроки(Текст1 = "Т1 ", Текст2 = "Т2 ") Экспорт
+ Возврат Текст1 + Текст2;
+КонецФункции
+
+Функция МетодБулево(Булево = Истина) Экспорт
+
+ Если Булево = Истина Или Булево Тогда
+ Возврат 1;
+ Иначе
+ Возврат 0;
+ КонецЕсли;
+
+КонецФункции
+
+Функция МетодНеопределено(Параметр = Неопределено) Экспорт
+
+ Если Параметр = Неопределено Тогда
+ Возврат 1;
+ Иначе
+ Возврат 0;
+ КонецЕсли;
+
+КонецФункции
+
+Функция МетодЧисло(Параметр1 = -1, Параметр2 ) Экспорт
+
+ Если Параметр1 = -1 Тогда
+ Возврат 1;
+ Иначе
+ Возврат 0 * Параметр2;
+ КонецЕсли;
+
+КонецФункции
\ No newline at end of file
diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os"
new file mode 100644
index 000000000..3aaddf5de
--- /dev/null
+++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\241\320\242\320\265\320\272\321\201\321\202\320\276\320\274\320\222\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\265.os"
@@ -0,0 +1,7 @@
+#native
+
+Перем Поле1 Экспорт;
+
+Процедура ПриСозданииОбъекта(Параметр1)
+ Поле1 = Параметр1;
+КонецПроцедуры
\ No newline at end of file
diff --git "a/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os" "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os"
new file mode 100644
index 000000000..a9f126b28
--- /dev/null
+++ "b/tests/native-lib/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271.os"
@@ -0,0 +1,18 @@
+#native
+
+Перем Поле1 Экспорт;
+
+Перем Поле2;
+
+Процедура ПриСозданииОбъекта()
+ Поле1 = 1;
+КонецПроцедуры
+
+
+Процедура Метод1()
+
+КонецПроцедуры
+
+Процедура Метод2() Экспорт
+
+КонецПроцедуры
\ No newline at end of file
diff --git a/tests/tasks.os b/tests/tasks.os
index a09b38028..42e1f2c42 100644
--- a/tests/tasks.os
+++ b/tests/tasks.os
@@ -19,6 +19,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьОжиданиеКонкретногоЗадания");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВЗаданииПроставленаИнформацияОбОшибке");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультат");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетБлокировка");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКодМожетОпределитьИДЗадания");
@@ -179,6 +180,22 @@
КонецПроцедуры
+Процедура ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата() Экспорт
+
+ Делегат = Новый Действие(ЭтотОбъект, "ПодсчетСуммы");
+
+ МассивПараметров = Новый Массив(2);
+ МассивПараметров[0] = 1;
+ МассивПараметров[1] = 5;
+
+ ФЗ = ФоновыеЗадания.Выполнить(Делегат, "Выполнить", МассивПараметров);
+
+ ФЗ.ОжидатьЗавершения();
+
+ юТест.ПроверитьРавенство(15, ФЗ.Результат);
+
+КонецПроцедуры
+
Процедура ТестДолжен_ПроверитьЧтоРаботаетБлокировка() Экспорт
глБлокировка = Новый БлокировкаРесурса;
diff --git a/tests/typedescription.os b/tests/typedescription.os
index d780c3620..8a58a8228 100644
--- a/tests/typedescription.os
+++ b/tests/typedescription.os
@@ -31,6 +31,14 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеДат");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеБезПриведения");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеЧисел");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеНеопределено");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьПриведениеОбъектов");
+
+ ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов");
+ ВсеТесты.Добавить("ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются");
+
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьОдинаковыйПорядокТипов");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьПорядокПриведенияТипов");
Возврат ВсеТесты;
@@ -445,3 +453,184 @@
юТест.ПроверитьРавенство(Описание.ПривестиЗначение(12345.555), 999.99, "Забивает девятками");
КонецПроцедуры
+
+Процедура ТестДолжен_Преобразование_ОписаниеБезТипов() Экспорт
+
+ МассивТиповНеопределено = Новый Массив;
+ МассивТиповНеопределено.Добавить(Тип("Неопределено"));
+
+ ПроверяемыеОписания = Новый СписокЗначений;
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов,
+ "Новый ОписаниеТипов"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов("Неопределено"),
+ "Новый ОписаниеТипов(""Неопределено"")"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов(МассивТиповНеопределено),
+ "Новый ОписаниеТипов(МассивТиповНеопределено)"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов("Undefined"),
+ "Новый ОписаниеТипов(""Undefined"")"
+ );
+
+ Для Каждого мЭлементПроверки Из ПроверяемыеОписания Цикл
+
+ ОписаниеБезТипов = мЭлементПроверки.Значение;
+ ОписаниеСлучая = мЭлементПроверки.Представление;
+
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(), Неопределено, "Приведение без параметра. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(1), 1, "Приведение числа. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение("1"), "1", "Приведение строки. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(Тип("Строка")), Тип("Строка"), "Приведение Типа. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение('20230817104356'), '20230817104356', "Приведение даты. " + ОписаниеСлучая);
+
+ ДД = ПолучитьДвоичныеДанныеИзСтроки("Строка");
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(ДД), ДД, "Двоичные данные не ломаются. " + ОписаниеСлучая);
+
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.Типы().Количество(), 0, "Типы() пустой. " + ОписаниеСлучая);
+ // юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ТестДолжен_Преобразование_ОписаниеБезТипов_КвалификаторыИгнорируются() Экспорт
+
+ КЧ = Новый КвалификаторыЧисла(1);
+ КС = Новый КвалификаторыСтроки(1);
+ КД = Новый КвалификаторыДаты(ЧастиДаты.Время);
+
+ МассивТиповНеопределено = Новый Массив;
+ МассивТиповНеопределено.Добавить(Тип("Неопределено"));
+
+ ПроверяемыеОписания = Новый СписокЗначений;
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов(, КЧ, КС, КД),
+ "Новый ОписаниеТипов(, КЧ, КС, КД)"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов("Неопределено", КЧ, КС, КД),
+ "Новый ОписаниеТипов(""Неопределено"", КЧ, КС, КД)"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов(МассивТиповНеопределено, КЧ, КС, КД),
+ "Новый ОписаниеТипов(МассивТиповНеопределено, КЧ, КС, КД)"
+ );
+ ПроверяемыеОписания.Добавить(
+ Новый ОписаниеТипов("Undefined", КЧ, КС, КД),
+ "Новый ОписаниеТипов(""Undefined"", КЧ, КС, КД)"
+ );
+
+ Для Каждого мЭлементПроверки Из ПроверяемыеОписания Цикл
+
+ ОписаниеБезТипов = мЭлементПроверки.Значение;
+ ОписаниеСлучая = мЭлементПроверки.Представление;
+
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(), Неопределено, "Приведение без параметра. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(123), 123, "Число не режется. " + ОписаниеСлучая); // не 1
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение("123"), "123", "Строка не режется. " + ОписаниеСлучая); // не "1"
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(Тип("Строка")), Тип("Строка"), "Значение типа Тип не ломается. " + ОписаниеСлучая);
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение('20230817104356'), '20230817104356', "Дата не режется. " + ОписаниеСлучая); // не `00010101104356`
+
+ ДД = ПолучитьДвоичныеДанныеИзСтроки("Строка");
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.ПривестиЗначение(ДД), ДД, "Двоичные данные не ломаются. " + ОписаниеСлучая);
+
+ юТест.ПроверитьРавенство(ОписаниеБезТипов.Типы().Количество(), 0, "Типы() пустой. " + ОписаниеСлучая);
+ юТест.ПроверитьЛожь(ОписаниеБезТипов.СодержитТип(Тип("Неопределено")), "Нет типа Неопределено. " + ОписаниеСлучая);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьПорядокПриведенияТипов() Экспорт
+
+ ОписаниеТипов = Новый ОписаниеТипов("Число, Строка", Новый КвалификаторыСтроки(1));
+
+ юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение(Истина), "Д"); // TODO: локализация
+ юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение("Строка"), "С");
+ юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение(15), 15);
+ юТест.ПроверитьРавенство(ОписаниеТипов.ПривестиЗначение('20230911'), "1"); // TODO: локализация
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьОдинаковыйПорядокТипов() Экспорт
+
+ ОТ = Новый ОписаниеТипов("Число, Строка");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число");
+
+ ОТ = Новый ОписаниеТипов("Строка, Число");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число");
+
+ ОТ = Новый ОписаниеТипов("Строка, Число, Строка");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число");
+
+ ОТ = Новый ОписаниеТипов("Число, Число, Строка");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Строка, Число");
+
+ ОТ = Новый ОписаниеТипов("Число, Число, Строка, Дата, Булево, Неопределено");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Булево, Строка, Дата, Число");
+
+ ОТ = Новый ОписаниеТипов("Неопределено, Число, Дата, Строка, Дата, Булево");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Булево, Строка, Дата, Число");
+
+ ОТ = Новый ОписаниеТипов("ДвоичныеДанные, Неопределено, Тип, NULL, Число, Дата, Строка, Дата, Булево");
+ ПроверитьПорядокТипов(ОТ.Типы(), "Булево, ДвоичныеДанные, Строка, Дата, Null, Число, Тип");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьПриведениеНеопределено() Экспорт
+
+ ОТ = Новый ОписаниеТипов("Число, Строка");
+ юТест.ПроверитьИстину(ОТ.СодержитТип(Тип("Неопределено")), "Неопределено содержится в описании типов");
+ юТест.ПроверитьРавенство(ОТ.Типы().Найти(Тип("Неопределено")), Неопределено, "Неопределено не содержится в типах");
+ юТест.ПроверитьРавенство(ОТ.ПривестиЗначение(Неопределено), Неопределено, "Неопределено в неопределено");
+
+ ОТ = Новый ОписаниеТипов;
+ юТест.ПроверитьРавенство(ОТ.ПривестиЗначение(Неопределено), Неопределено, "Неопределено в неопределено");
+ юТест.ПроверитьЛожь(ОТ.СодержитТип(Тип("Неопределено")), "Неопределено не содержится в описании типов (без типов)");
+ юТест.ПроверитьРавенство(ОТ.Типы().Найти(Тип("Неопределено")), Неопределено, "Неопределено не содержится в типах");
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьПриведениеОбъектов() Экспорт
+
+ ОТ = Новый ОписаниеТипов("Массив, Структура, Строка");
+
+ М1 = Новый Массив;
+ М1.Добавить(1);
+ М1.Добавить(2);
+
+ М2 = ОТ.ПривестиЗначение(М1);
+ юТест.ПроверитьРавенство(М2, М1, "Массив тот же самый");
+
+КонецПроцедуры
+
+Процедура ПроверитьПорядокТипов(Знач ТипыОписанияТипов, Знач ОжидаемыйПорядок, Знач Текст = Неопределено)
+
+ Если Текст = Неопределено Тогда
+ Текст = СтрШаблон("Ожидаемый порядок: %1
+ |Полученный порядок: %2", ОжидаемыйПорядок, СтрСоединить(ТипыОписанияТипов, ", ")
+ );
+ КонецЕсли;
+
+ ТипыСтроками = СтрРазделить(ОжидаемыйПорядок, ",");
+
+ юТест.ПроверитьБольшеИлиРавно(ТипыОписанияТипов.Количество(), ТипыСтроками.Количество(), Текст);
+
+ ИндексТипа = 0;
+ Для Каждого мТипСтрокой Из ТипыСтроками Цикл
+
+ ТипОписания = ТипыОписанияТипов[ИндексТипа];
+ ТипОжидаемый = Тип(СокрЛП(мТипСтрокой));
+
+ юТест.ПроверитьРавенство(ТипОписания, ТипОжидаемый);
+
+ ИндексТипа = ИндексТипа + 1;
+
+ КонецЦикла;
+
+КонецПроцедуры