From a240827d544089de3be2a4f3c278676eeeb88f71 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 4 Jan 2019 15:46:25 +0200 Subject: [PATCH] Added a test for passing an std::string by value. Signed-off-by: Dimitar Dobrev --- tests/Common/Common.Tests.cs | 22 ++++++++++++++++++++++ tests/Common/Common.cpp | 5 +++++ tests/Common/Common.h | 1 + 3 files changed, 28 insertions(+) diff --git a/tests/Common/Common.Tests.cs b/tests/Common/Common.Tests.cs index 945db34d..ec5cf119 100644 --- a/tests/Common/Common.Tests.cs +++ b/tests/Common/Common.Tests.cs @@ -777,6 +777,28 @@ This is a very long string. This is a very long string. This is a very long stri } } + [Ignore("https://github.com/mono/CppSharp/issues/867")] + public void TestStdStringPassedByValue() + { + // when C++ memory is deleted, it's only marked as free but not immediadely freed + // this can hide memory bugs while marshalling + // so let's use a long string to increase the chance of a crash right away + const string t = @"This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. +This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string. This is a very long string."; + using (var hasStdString = new HasStdString()) + { + Assert.That(hasStdString.TestStdStringPassedByValue(t), Is.EqualTo(t + "_test")); + hasStdString.S = t; + Assert.That(hasStdString.S, Is.EqualTo(t)); + Assert.That(hasStdString.StdString, Is.EqualTo(t)); + Assert.That(hasStdString.StdString, Is.EqualTo(t)); + } + } + public void TestNullStdString() { using (var hasStdString = new HasStdString()) diff --git a/tests/Common/Common.cpp b/tests/Common/Common.cpp index 987fb9f7..bf499557 100644 --- a/tests/Common/Common.cpp +++ b/tests/Common/Common.cpp @@ -504,6 +504,11 @@ std::string HasStdString::testStdString(const std::string& s) return s + "_test"; } +std::string HasStdString::testStdStringPassedByValue(std::string s) +{ + return s + "_test"; +} + std::string& HasStdString::getStdString() { return s; diff --git a/tests/Common/Common.h b/tests/Common/Common.h index 0b6117dd..a852000b 100644 --- a/tests/Common/Common.h +++ b/tests/Common/Common.h @@ -856,6 +856,7 @@ public: HasStdString(); ~HasStdString(); std::string testStdString(const std::string& s); + std::string testStdStringPassedByValue(std::string s); std::string s; std::string& getStdString(); };